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.