У меня есть 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."
Я не могу найти решение проблемы. Есть ли какое-либо решение или идея, пожалуйста, поделитесь. Заранее спасибо.