sqlalchemy column_property和left join

时间:2018-02-13 22:16:11

标签: python postgresql sqlalchemy left-join

我有两个模型,Student和TestResult,它们通过两个表上的student_id通过一对多关系链接。一个学生可以有很多测试结果,或者(这就是问题开始的地方......)根本没有测试结果。

我在TestResult上使用@hybrid_property创建了一个计算列,告诉我当前的结果是什么,我在学生模型中添加了另一列,告诉我该特定学生是否有当前的测试结果,即学生.test_taken =如果他们今天参加了测试,则为真。

我的问题在于没有current_result的学生。我已经使用了下面的代码,但这似乎过于复杂的纯SQL,这是一个非常简单的问题。我已经尝试过重写作为一个合并,但我不能像我期望的那样让它工作,而且我甚至不确定我是否以正确的方式解决这个问题。

有人可以建议我是否正确接近,如果没有,请帮助我找到更好的解决方案吗?

class TestResult(db.Model):
    __tablename__ = 'testresult'

    result_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    student_id = db.Column(db.ForeignKey('students.studentid'))
    test_date = db.Column(db.Date)
    test_result = db.Column(db.String)

    @hybrid_property
    def current_result(self):
        if self.test_date = datetime.today:
            return True
        else:
            return False

    @current_result.expression
    def current_result(self):
        return case([
            (self.test_date = func.now(), True)
        ], else_ = False)


class Student(db.Model):
    __tablename__ = 'student'
    student_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    firstname = db.Column(db.String)
    surname = db.Column(db.String)
    class = db.Column(db.String)

    test_taken = column_property(

        select([
            case([(exists().where(and_(
                student_id == TestResult.student_id,
                TestResult.current_result == True,
            )).correlate_except(TestResult), True)],
                 else_=False,
            )
        ])
    )
    test_results = relationship('TestResult', backref='student')

0 个答案:

没有答案