如何在SQLAlchemy中指定一个条件要求列为null的关系?
我不太确定这个问题该怎么命名。我有以下的结构:
- 事项(Matters)和工作项(WorkItems)之间是一对多的关系。
- 工作项(WorkItems)和行项(LineItems)之间是一对一(或者一对零)的关系。
我想在事项和工作项之间建立以下关系:
Matter.unbilled_work_items = orm.relation(WorkItem,
primaryjoin = (Matter.id == WorkItem.matter_id) and (WorkItem.line_item_id == None),
foreign_keys = [WorkItem.matter_id, WorkItem.line_item_id],
viewonly=True
)
但是这样会报错:
AttributeError: '_Null' object has no attribute 'table'
这个错误似乎在说,第二个条件的返回结果是一个类型为 _Null 的对象,但它似乎期望的是一个有“table”属性的东西。
对我来说,这看起来应该是很简单的事情,我是不是漏掉了什么明显的东西?
更新
解决办法是把 primaryjoin
这一行改成:
primaryjoin = "and_(Matter.id == WorkItem.matter_id, WorkItem.line_item_id == None)"
2 个回答
1
除了_Null的问题,这个操作需要使用左外连接才能正确完成。我决定让unbilled_work_items成为一个属性,它会执行一个查询并返回结果。
# like this
@property
def unbilled_work_items(self):
return Session.object_session(self).query.filter(...).all()
6
试着使用 and_
,因为 and
这个词没有被重载:
and_((Matter.id == WorkItem.matter_id), (WorkItem.line_item_id == None))