Just tried running the code you posted, but in my case it keeps using the 
default query_class (Query) instead of the "MyPrefulteredQuery".
Not sure if there was a breaking change on SA since you posted this. 


On Tuesday, July 22, 2014 at 11:35:49 AM UTC-7, Meg Mitchell wrote:
>
> I had the same problem and decided to look into implementing a custom 
> relationship like you suggested. I'll post what I have here in case anyone 
> else has the same problem. :) 
>
> The first thing I noticed was the query_class attribute on the 
> RelationshipProperty class. If you don't want to implement a new 
> relationship, you can just do this, which is a little cleaner than 
> respecifying the primaryjoin:
>
> children = relationship(Child, query_class=MyPrefilteredQuery)
>
>
> (Where MyPrefilteredQuery is the PreFilteredQuery class you implemented as 
> per 
> https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/PreFilteredQuery 
> .)
>
> Making your own relationship is pretty straightforward from there, though:
>  
>
>
> from sqlalchemy.util.langhelpers import public_factory
> from sqlalchemy.orm.relationships import RelationshipProperty
>
> class MyPrefilteredRelationship(RelationshipProperty):
>     def __init__(self, *args, **kwargs):
>         kwargs['query_class'] = MyPrefilteredQuery 
>         super(MyPrefilteredRelationship, self).__init__(*args, **kwargs)
>
> filtered_relationship = public_factory(MyPrefilteredRelationship, 
> ".mylib.db") 
>
>
> Then you can use it like so:
>
> from mylib.db import filtered_relationship 
>
> class Parent(Base):
>     __table__ = parent_table
>     children = filtered_relationship(Child)
>
>
> On Sunday, February 20, 2011 8:19:58 PM UTC-8, robert wrote:
>>
>> On Feb 20, 8:59 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: 
>> > the cleanest and most foolproof way is to join on relationships that 
>> have the condition: 
>> > 
>> > related_non_deleted = relationship(Related, 
>> primaryjoin=and_(Related.deleted==False, Related.foo_id==id), 
>> viewonly=True) 
>>
>> I agree that the explicit approach is the most foolproof.  The main 
>> reason I was trying to avoid it is that, in my case, the condition is 
>> ubiquitous. Thus all of my relationships that look like this 
>>
>> children = relationship(Child) 
>>
>> would have to change to 
>>
>> children = relationship(Child, primaryjoin=and_(Child.deleted==False, 
>> Child.parent_id==id) 
>>
>> Perhaps I could write a custom relationship() to simplify things. 
>> I'll give that a try.  I'll also have to 
>> add .filter(foo.deleted==False) to all top level queries.  Maybe a 
>> custom Session that always answers a query with that filter already 
>> added would be cleaner.  There may ultimately be many queries and many 
>> relationships in this app, and I'm trying to avoid having to remember 
>> (or worse, have someone else remember) to always include the deleted 
>> condition. 
>>
>> Thanks for your help.  I've got a bit of digging to do now.
>
>

-- 
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 https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to