如何在SQLAlchemy中指定一个条件要求列为null的关系?

3 投票
2 回答
2806 浏览
提问于 2025-04-15 22:53

我不太确定这个问题该怎么命名。我有以下的结构:

  • 事项(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))

撰写回答