【问题标题】:How to config Many-to-many with condition, in Sqlalchemy如何在 Sqlalchemy 中使用条件配置多对多
【发布时间】:2011-04-06 15:15:53
【问题描述】:

我正在使用 sqlalchemy 0.6.4。

我有 2 个类:Question 和 Tag,它们是多对多的。

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)

所以,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')

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

【问题讨论】:

  • 删除所有“已删除”问题的 QuestionTag 记录是否有意义?也许您可以创建一个“已删除问题”关系并将问题“移动”到那里。
  • 你的意思是我可以创建另一个表来保存“deleted_questions_tags”吗?太复杂了

标签: many-to-many sqlalchemy conditional-statements


【解决方案1】:

您可以通过将 SQLAlchemy 的默认条件(通过 secondaryjoin 参数替换为 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2017-08-18
    • 2019-09-11
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多