查询sqlalchemy中的多对多关系

时间:2019-08-03 21:38:20

标签: sql database flask sqlalchemy

我有两个通过关系表链接的数据库类,我可以检索分配给每篇论文的问题。但是,我想检索当前分配给当前论文的所有问题,无论它们分配给了其他任何论文。我尝试了很多不同的事情,我没有做任何想要的事情。

我相信应该使用某种外部的左联接,但是我无法弄清楚正确的语法。

预先感谢您的建议。

到目前为止,这是数据库结构:

class Question(db.Model):
    __tablename__ = 'question'
    id = db.Column(db.Integer, primary_key=True)
    papers = db.relationship(
            'Paper', secondary='question_in', backref='has_question', lazy='dynamic')

class Paper(db.Model):
    __tablename__ = 'paper'
    id = db.Column(db.Integer, primary_key=True)
    #returns the questions in the paper
    def all_questions(self):
        questions = Question.query.filter(Question.papers.any(id=self.id)).all()
        return questions

Question_in = db.Table('question_in',
    db.Column('question_id', db.Integer, db.ForeignKey('question.id'), primary_key=True),
    db.Column('paper_id', db.Integer,db.ForeignKey('paper.id'), primary_key=True), 
)

1 个答案:

答案 0 :(得分:1)

您应该能够遵循在all_questions函数中使用的相同逻辑,并使用subquery()对其进行过滤:

def not_assigned(self):
    assigned_questions = db.session.query(Question.id)\
                        .filter(Question.papers.any(id=self.id)).subquery()
    not_assigned = db.session.query(Question)\
                        .filter(Question.id.notin_(assigned_questions)).all()
    return not_assigned