代码之家  ›  专栏  ›  技术社区  ›  Jesse Dhillon

在一个条件要求列为空的情况下,如何在SQLAlchemy中指定关系?

  •  3
  • Jesse Dhillon  · 技术社区  · 15 年前

    不确定这个问题的正确标题是什么。我有以下模式:

    • 事物与工作项有着千丝万缕的联系。
    • 工作项与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'
    

    这似乎是说primaryjoin中的第二个子句返回了一个类型为\null的对象,但它似乎希望得到具有“table”属性的对象。

    这对我来说应该很直接,我是否遗漏了一些明显的东西?

    更新

    答案是改变 primaryjoin 线到:

    primaryjoin = "and_(Matter.id == WorkItem.matter_id, WorkItem.line_item_id == None)"
    
    2 回复  |  直到 14 年前
        1
  •  6
  •   ThiefMaster    15 年前

    试用使用 and_ 作为 and 未超载:

    and_((Matter.id == WorkItem.matter_id), (WorkItem.line_item_id == None))
    
        2
  •  1
  •   Jesse Dhillon    14 年前

    除了空问题之外,这还需要一个左外部联接来正确执行。我已经决定,未绑定的工作项应该是执行查询并返回结果的属性。

    # like this
    
    @property
    def unbilled_work_items(self):
      return Session.object_session(self).query.filter(...).all()