Как настроить многие-ко-многим с условием, в Sqlalchemy - PullRequest
0 голосов
/ 01 сентября 2010

Я использую 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)

Итак, 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 нет. Что я могу сделать сейчас?

1 Ответ

9 голосов
/ 03 сентября 2010

Вы можете наложить дополнительные условия на объединение, заменив стандартное условие 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))
...