Аннотированное значение набора запросов предварительной выборки пользователя вне аннотации, связанной с предварительной выборкой - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть 3 модели, как показано ниже:

class Customer(models.Model):
  customer_name = models.CharField(max_length=100)
  customer_phone = models.CharField(unique=True, max_length=11)
  customer_address = models.TextField(max_length=200, null=True)

  objects = CustomerManger()

class Order(models.Model):
  customer = models.ForeignKey(Customer, related_name='order_customer', on_delete=models.CASCADE)
  ordered_date = models.DateTimeField(auto_now_add=True)
  is_paid = models.BooleanField(default=False)
  paid_total = models.FloatField(default=0)

  objects = OrderManager()

class OrderedItem(models.Model):
  product = models.ForeignKey(ProductVariant, on_delete=models.CASCADE)
  price_per_product = models.FloatField(default=0.0)
  discount_percent = models.IntegerField(default=0)
  quantity = models.IntegerField(default=0)
  order = models.ForeignKey(Order, related_name='ordered_items', on_delete=models.CASCADE)

Мне нужны все клиенты с дополнительными расчетами, такими как общее количество покупок и общая сумма взносов.

Итак, мой запрос выглядит так:

data = self.model.objects.prefetch_related(
        Prefetch(
            'order_customer',
            queryset=Order.objects.prefetch_related('ordered_items').annotate(
                due=Case(
                    When(is_paid=False,
                         then=Sum(F('ordered_items__quantity') * F(
                             'ordered_items__price_per_product') *
                                  (Value(1) - (F('ordered_items__discount_percent') / 100.00))) - F(
                             'paid_total')), default=Value(0),
                    output_field=FloatField()
                )
            ),
            to_attr='order'
        )
    ).annotate(total_due=Sum(F('order_customer__due')))

Мне нужны такие данные:

[
  customer: {
              customer_name,
              customer_id,
              total_due,
              total_purchased_item
             }
 ]

Здесь я считаю счет за заказ в наборе запросов Prefetch и помещаю значение в срок. Но за пределами аннотации предварительной выборки я не могу получить доступ к значению из-за. Но нормальные аннотированные значения могут быть доступны в цепочке аннотирования. Это дает мне ошибку

"Unsupported lookup 'due' for AutoField or join on the field not permitted."

Я не могу найти решение проблемы. Есть ли какое-либо решение или идея, пожалуйста, поделитесь. Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...