我有以下模特:
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()
答案 0 :(得分:2)
您可以使用常规relationship和association 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
上创建一个可以按照您想要的方式工作的属性。