我有一个Order
模型和Payment
模型。付款模式的jsonb
列为data
。
我的查询:
orders = (
Order
.select(Order, Payment.data.alias('payment_data'))
.join(Payment, JOIN_LEFT_OUTER, on=(Order.payment==Payment.id))
.iterator()
)
当我遍历以上查询并访问order.payment_data
时,我得到了AttributeError
但是,如果我在下面编写查询,它会在遍历订单时为我提供字典中的payment_data
键:
orders = (
Order
.select(Order, Payment.data.alias('payment_data'))
.join(Payment, JOIN_LEFT_OUTER, on=(Order.payment==Payment.id))
.dicts()
.iterator()
)
有人可以解释一下我在第一个查询中做错了什么,以及如何访问order.payment_data
?
谢谢
这可能是在合并结果中包含NULL
字段的结果。可能您错过了payment_data
的某些记录,而peewee无法按预期处理这种情况。
检查查询结果是否在NULL
处包含payment_data
。如果是这样,您可能应该检查每次迭代中order
是否具有payment_data
属性。
有关Github的更详细说明,https://github.com/coleifer/peewee/issues/1756#issuecomment-430399189
当我遍历以上查询并访问order.payment_data时,我得到AttributeError
付款数据可能已附加到相关的付款实例。因此,您可以使用[]来代替order.payment_data
:
order.payment.payment_data
如果要简单地将所有属性直接修补到订单上,请使用
objects()
查询方法,该方法将跳过模型/关系图:
orders = (Order .select(Order, Payment.data.alias('payment_data')) .join(Payment, JOIN_LEFT_OUTER, on=(Order.payment==Payment.id)) .objects() # Do not make object-graph .iterator()) for order in orders: print(order.id, order.payment_data)
这已全部包含在文档中:http://docs.peewee-orm.com/en/latest/peewee/relationships.html#selecting-from-multiple-sources