如何在Sqlalchemy中使用条件配置多对多

Fre*_*ind 1 many-to-many sqlalchemy conditional-statements

我用sqlalchemy 0.6.4.

我有2个课程:问题和标签,它们是多对多的.

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)
Run Code Online (Sandbox Code Playgroud)

因此,tag.questions将所有问题都归属于标签.

但是现在,既然Question有一个deleted专栏,我希望这样做:

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')
Run Code Online (Sandbox Code Playgroud)

但不幸的是,没有这样的condition参数.我现在能做什么?

dha*_*fey 9

您可以通过secondaryjoin参数to 替换SQLAlchemy的默认条件,在连接上强加额外条件relationship.由于您要替换默认值(而不仅仅是添加默认值),因此您需要手动重新指定原始条件以及新条件:

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))
Run Code Online (Sandbox Code Playgroud)