Писающий псевдоним не работает и выдает AttributeError - PullRequest
1 голос
/ 25 января 2020

У меня есть 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 в dict при переборе заказов:

orders = (
          Order
          .select(Order, Payment.data.alias('payment_data'))
          .join(Payment, JOIN_LEFT_OUTER, on=(Order.payment==Payment.id))
          .dicts()
          .iterator()
         )

Может кто-нибудь, пожалуйста, объясните мне, кто я делать неправильно в первом запросе и как получить доступ к order.payment_data?

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Когда я выполняю итерацию по вышеуказанному запросу и получаю доступ к 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 -из нескольких источников

0 голосов
/ 25 января 2020

Это может быть результатом наличия полей NULL в объединенных результатах. Возможно, вы пропускаете payment_data для некоторых записей, и peewee не обрабатывает эту ситуацию, как ожидалось.

Проверьте, содержат ли результаты вашего запроса NULL s вместо payment_data. Если это так, вы, вероятно, должны проверить, имеет ли order атрибут payment_data на каждой итерации.

Вот более подробное объяснение Github: https://github.com/coleifer/peewee/issues/1756#issuecomment -430399189

...