SqlAlchemy - Filtering by Relationship Attribute

后端 未结 5 654
日久生厌
日久生厌 2020-12-07 13:09

I don\'t have much experience with SQLAlchemy and I have a problem, which I can\'t solve. I tried searching and I tried a lot of code. This is my Class (reduced to the most

相关标签:
5条回答
  • 2020-12-07 13:18

    This is a more general answer on how to query relationships.

    relationship(..., lazy='dynamic', ...)
    

    This allows you to:

    parent_obj.some_relationship.filter(ParentClass.some_attr==True).all()
    
    0 讨论(0)
  • 2020-12-07 13:19

    You have to query the relationsip with join

    You will get the example from this Self-Referential Query Strategies

    0 讨论(0)
  • 2020-12-07 13:32

    Good news for you: I recently made package that gives you filtering/sorting with "magical" strings as in Django, so you can now write something like

    Patient.where(mother___phenoscore=10)
    

    It's a lot shorter, especially for complex filters, say,

    Comment.where(post___public=True, post___user___name__like='Bi%')
    

    Hope you will enjoy this package

    https://github.com/absent1706/sqlalchemy-mixins#django-like-queries

    0 讨论(0)
  • 2020-12-07 13:37

    Use method has() of relationship (more readable):

    patients = Patient.query.filter(Patient.mother.has(phenoscore=10))
    

    or join (usually faster):

    patients = Patient.query.join(Patient.mother, aliased=True)\
                        .filter_by(phenoscore=10)
    
    0 讨论(0)
  • 2020-12-07 13:41

    I used it with sessions, but an alternate way where you can access the relationship field directly is

    db_session.query(Patient).join(Patient.mother) \
        .filter(Patient.mother.property.mapper.class_.phenoscore==10)
    

    I have not tested it, but I guess this would also work

    Patient.query.join(Patient.mother) \
        .filter(Patient.mother.property.mapper.class_.phenoscore==10)
    
    0 讨论(0)
提交回复
热议问题