I have been looking at making an ordered many-to-many list. The example from Jason Kirkland from 2008 (http://groups.google.com/group/sqlalchemy/browse_thread/thread/611c88ee27354246 ) worked, but our version of it did not. I have modified his version (see code at the end of the mail) to use declarative syntax to make it more similar to others, which ended up revealing something interesting. Writing the associationproxy like this:

    movies = association_proxy('usermovies', 'movie')


works fine. But writing it like this:

    movies = association_proxy(usermovies, 'movie')


which should be identical gives this error:

Traceback (most recent call last):
  File "x.py", line 43, in<module>
    class User(BaseObject):
  File "x.py", line 49, in User
    movies = association_proxy(usermovies, 'movie')
  File 
"/home/wichert/lib/buildout/eggs/SQLAlchemy-0.7.5-py2.7-linux-x86_64.egg/sqlalchemy/ext/associationproxy.py",
 line 76, in association_proxy
    return AssociationProxy(target_collection, attr, **kw)
  File 
"/home/wichert/lib/buildout/eggs/SQLAlchemy-0.7.5-py2.7-linux-x86_64.egg/sqlalchemy/ext/associationproxy.py",
 line 136, in __init__
    type(self).__name__, target_collection, id(self))
  File 
"/home/wichert/lib/buildout/eggs/SQLAlchemy-0.7.5-py2.7-linux-x86_64.egg/sqlalchemy/orm/properties.py",
 line 734, in __str__
    return str(self.parent.class_.__name__) + "." + self.key
AttributeError: 'RelationshipProperty' object has no attribute 'parent'


I am not sure if that is a bug in SQLAlchemy or a wrong expectation on my side.

Regards,
Wichert.


from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.orderinglist import ordering_list
from sqlalchemy.ext.associationproxy import association_proxy

meta = MetaData('sqlite://')
users = Table('users', meta,
               Column('id', Integer, primary_key=True),
               Column('name', String(128)))
movies = Table('movies', meta,
                Column('id', Integer, primary_key=True),
                Column('name', String(128)))
user_movies = Table('user_movies', meta,
                     Column('user_id', Integer,
                            ForeignKey('users.id'),
                            primary_key=True),
                     Column('movies_id', Integer,
                            ForeignKey('movies.id'),
                            primary_key=True),
                     Column('position', Integer))
meta.create_all()

BaseObject = declarative_base(metadata=meta)

class Movie(BaseObject):
    __table__ = movies

    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return '<Movie %r>' % self.name

class UserMovie(BaseObject):
    __table__ = user_movies

    movie = relation(Movie)

    def __init__(self, movie):
        self.movie = movie


class User(BaseObject):
    __table__ = users

    usermovies = relation(UserMovie, backref='user',
             cascade='all, delete-orphan',
             collection_class=ordering_list('position'))
    movies = association_proxy('usermovies', 'movie')


session = create_session()
u = User()
u.movies.extend([Movie('a'), Movie('b'), Movie('c')])
session.add(u)
session.flush()
print list(user_movies.select().execute())
del u.movies[2]
session.flush()
print list(user_movies.select().execute())


--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to