Adrian <adr...@planetcoding.net> wrote:

>     @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'
>             )
>         )


the primaryjoin should be either the expression as a Python object (not a 
string), 
or a lambda that returns the expression object (not a string), or if you’re 
using 
declarative it can be a string that’s eval’ed. But not a lambda *and* a string 
at 
the same time.


> 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’>

yeah that’s the lambda + string together which is not the correct use.


> 
> 
> 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).

the model here doesn’t illustrate how this would be a many-to-many.

-- 
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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to