2010-09-01 19 views
0

Je suis utiliser sqlalchemy 0.6.4.Comment config Beaucoup-à-plusieurs avec condition, dans Sqlalchemy

J'ai 2 classes: Question et Tag, ils sont plusieurs-à-plusieurs.

class Question(Base): 
    __tablename__ = "questions" 

    id = Column(Integer, primary_key=True) 
    deleted = Column(Boolean) 
    ... 
    tags = relationship('Tag', secondary=r_questions_tags) 

class Tag(Base): 
    __tablename__ = "tags" 

    id = Column(BigInteger, primary_key=True) 
    questions = relationship('Question', secondary=r_questions_tags) 

Alors, tag.questions obtiendrez toutes les questions appartiennent à une balise.

Mais maintenant, puisque le Question a une colonne deleted, je l'espère faire comme ceci:

class Tag(Base): 
    ... 

    # get non-deleted questions 
    questions = relationship('Question', secondary=r_questions_tags, 
          condition='Question.deleted==False') 
    # get deleted questions 
    deleted_questions = relationship('Question', secondary=r_questions_tags, 
          condition='Question.deleted==True') 

Mais malheureusement, il n'y a pas un tel paramètre condition. Que puis-je faire maintenant?

+0

Ne serait-il judicieux de supprimer les enregistrements QuestionTag pour tous "supprimé" des questions? Peut-être pourriez-vous créer une relation "questions supprimées" et "déplacer" la question là-bas. – Marco

+0

Voulez-vous dire que je peux créer une autre table pour contenir les «deleted_questions_tags»? C'est trop compliqué – Freewind

Répondre

7

Vous pouvez imposer des conditions supplémentaires à la jointure en remplaçant la condition par défaut de SQLAlchemy via le paramètre secondaryjoin par relationship. Puisque vous remplacez la valeur par défaut (pas seulement ajoutant), vous devrez re-spécifier manuellement l'état d'origine ainsi que la nouvelle:

from sqlalchemy import sql 

# ... 

class Tag(Base): 
    __tablename__ = "tags" 

    id = Column(BigInteger, primary_key=True) 

    questions = relationship('Question', 
     secondary=r_questions_tags, 
     secondaryjoin=sql.and_(
      r_questions_tags.c.question_id == Question.id, 
      Question.deleted == False)) 

    deleted_questions = relationship('Question', 
     secondary=r_questions_tags, 
     secondaryjoin=sql.and_(
      r_questions_tags.c.question_id == Question.id, 
      Question.deleted == True))