SQLAlchemy:@property映射?

时间:2016-02-26 14:10:02

标签: python python-2.7 sqlalchemy flask-sqlalchemy

我有以下模特:

class Details(db.Model):

    details_id = db.Column(db.Integer, primary_key=True)
    details_main = db.Column(db.String(50))
    details_desc = db.Column(db.String(50))

class Data(db.Model):

    data_id = db.Column(db.Integer, primary_key=True)
    data_date = db.Column(db.Date)
    details_main = db.Column(db.String(50))

    @property
    def details_desc(self):

        result = object_session(self).\
            scalar(
                select([Details.details_desc]).
                    where(Details.details_main == self.details_main)
            )

        return result

现在,我想使用依赖于已定义属性的过滤器来运行查询。我得到空结果(当然正确数据在DB中)。它不起作用,因为我可能需要映射这个属性。问题是如何做到这一点? (一个限制:不允许使用FK。)

Data.query\
    .filter(Data.details_desc == unicode('test'))\
    .all()

1 个答案:

答案 0 :(得分:2)

您可以使用常规relationshipassociation proxy

来实现此目的
class Data(db.Model):
    data_id = db.Column(db.Integer, primary_key=True)
    data_date = db.Column(db.Date)
    details_main = db.Column(db.String(50))

    details = relationship(
        Details,
        primaryjoin=remote(Details.details_main) == foreign(details_main))
    details_desc = association_proxy('details', 'details_desc')

由于模式中没有外键,因此您需要自己告诉SQLAlchemy relationship的连接条件应该是什么。这是remote()foreign()注释的作用。

有了这个,您可以在关系中使用association_proxy“在Data上创建一个可以按照您想要的方式工作的属性。