@declared_attr
def user(cls):
"""The user owning this favorite"""
return db.relationship(
'User',
lazy=False,
foreign_keys=lambda: [cls.user_id],
backref=db.backref(
'_favorite_users',
lazy=True,
cascade='all, delete-orphan',
primaryjoin=lambda: '(User.id == user_id) &
~target.is_deleted'
)
)
I've added it on the backref since that's the relationship where I want the
filter to apply.
In the end I'd like to be able to do this:
User.query.get(123)._favorite_users which would get me a list of all the
favorite users (I'll be using association_proxy, but for now I need to get
the relationships themselves working) besides those users who have
is_deleted=True (on the User, not the FavoriteUser).
But no matter what I put there (tried both lambdas and strings), I always
get this error (so I can't even try to figure out the correct criteria to
use, since it fails early, during mapper configuration time):
sqlalchemy.exc.ArgumentError: Column-based expression object expected for
argument 'primaryjoin'; got: '(User.id == user_id) & ~target.is_deleted',
type <type 'unicode'>
Actually.... looking at this code again... it's almost a standard
many-to-many relationship, so I should probably be using secondary and
secondaryjoin somewhere. Can I define this backref-like, i.e. from within
the FavoriteUser model? That way I don't have to spread things around so
much (which would be the case if I defined the relationship in the User
model).
-- Adrian
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.