2015-10-29 3 views
2

Я пытаюсь отфильтровать отношения. В моем db у меня есть награды и награды. Я хочу получить только избранные и не назначенные награды.Фильтр по отношениям

Это моя модель:

class AwardsAwardsCategory(Base): 
    __tablename__ = 'awards_awards_categories' 
    id = Column(Text, primary_key=True, default=generate_unique_id) 
    awards = relationship("Award") 
    award_id = Column(Text, ForeignKey("awards.id", ondelete='cascade')) 
    nomination = Column(Boolean) 

    def __json__(self, request): 
     return { 
      "id": self.id, 
      "nomination": self.nomination 
     } 


class Award(Base): 
    __tablename__ = 'awards' 
    id = Column(Text, primary_key=True, default=generate_unique_id) 
    type = Column(Text) 
    featured = Column(Integer) 
    awards = relationship("AwardsAwardsCategory", lazy='joined') 

    def __json__(self, request): 
     return { 
      "id": self.id, 
      "type": self.type, 
      "number_of_awards": len(self.awards), 
      "featured": self.featured, 

     } 

Это вызов я делаю:

query = self.session.query(Award) 
    query = query.join(AwardsAwardsCategory.awards) 
    query = query.filter(Award.featured != 0) 
    query = query.filter(AwardsAwardsCategory.nomination != True) 
    q_results = query.all() 

Это приводит к следующему запросу:

SELECT awards.id AS awards_id, awards.type AS awards_type, awards.featured AS awards_featured, awards_awards_categories_1.id AS awards_awards_categories_1_id, awards_awards_categories_1.award_id AS awards_awards_categories_1_award_id, awards_awards_categories_1.nomination AS awards_awards_categories_1_nomination 
FROM awards_awards_categories JOIN awards ON awards.id = awards_awards_categories.award_id LEFT OUTER JOIN awards_awards_categories AS awards_awards_categories_1 ON awards.id = awards_awards_categories_1.award_id 
WHERE awards.featured != 0 AND awards_awards_categories.nomination != true 

Это почти правильно, кроме WHERE отсутствует условие:

AND awards_awards_categories_1.nomination != true 

Как я могу изменить свой код, чтобы он добавил последнее условие в предложение WHERE.

ответ

0

В результате я включил фильтрацию на номинацию на прикладном уровне. Это противно, но это работает.

query = self.session.query(Award) 
query = query.join(AwardsAwardsCategory.awards) 
query = query.filter(Award.featured != 0) 
query = query.filter(AwardsAwardsCategory.nomination != True) 
q_results = query.all() 

# remove all objects from the session in order to keep them in the db. 
self.session.expunge_all() 
for award_category in q_results: 
    # keep a separate list of the awards, in order to keep the iteration going as desired 
    awards = list(award_category) 
    for award in award_category.awards: 
     if award.nomination: 
      awards.remove(award) 
    def __json__(self, request): 
     return { 
      "id": self.id, 
      "type": self.type, 
      "number_of_awards": self.number_of_awards, 
      "featured": self.featured, 
     } 
    award_category.number_of_awards = len(awards) 
    award_category.__json__ = types.MethodType(__json__, a) 

Если кто-нибудь знает, как это сделать лучше в SQLAlchemy, пожалуйста, скажите мне!

Смежные вопросы