Peewee别名不起作用并抛出AttributeError

问题描述 投票:1回答:2

我有一个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

谢谢

python peewee
2个回答
0
投票

这可能是在合并结果中包含NULL字段的结果。可能您错过了payment_data的某些记录,而peewee无法按预期处理这种情况。

检查查询结果是否在NULL处包含payment_data。如果是这样,您可能应该检查每次迭代中order是否具有payment_data属性。

有关Github的更详细说明,https://github.com/coleifer/peewee/issues/1756#issuecomment-430399189


0
投票

当我遍历以上查询并访问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

© www.soinside.com 2019 - 2024. All rights reserved.