Как указать отношение в SQLAlchemy, где одно условие требует, чтобы столбец был нулевым? - PullRequest
3 голосов
/ 19 мая 2010

Не уверен, какой должен быть правильный заголовок для этого вопроса. У меня есть следующая схема:

  • Вопросы имеют отношение один-много к WorkItems.
  • WorkItems имеют отношение один-один (или один-ноль) к LineItems.

Я пытаюсь создать следующую связь между Matters и WorkItems

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 ]

6 голосов
/ 19 мая 2010

Попробуйте использовать and_, так как and не перегружен:

and_((Matter.id == WorkItem.matter_id), (WorkItem.line_item_id == None))
1 голос
/ 19 мая 2010

Помимо проблемы _Null, для правильной работы требуется левое внешнее соединение.Я решил, что unbilled_work_items должен быть свойством, которое выполняет запрос и возвращает результат.

# like this

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