Как получить данные из родительской таблицы через дочернюю таблицу
Я хочу получить все названия продуктов, которые были заказаны и сохранены в таблице OrderItem, и я хочу суммировать их количество, сгруппированное по названию продукта. Помогите!!!
Вот мои таблицы.
class m_Product(models.Model):
name = models.CharField(max_length=200)
Brand = models.CharField(max_length=200)
quantity = models.IntegerField(default=0, null=True, blank=True)
price = models.DecimalField(max_digits=7, decimal_places=2)
digital = models.BooleanField(default=False, null=True, blank=True)
image = models.ImageField(null=True, blank=True)
description = models.CharField(max_length=2000)
tags = models.CharField(max_length=20)
class OrderItem(models.Model):
product = models.ForeignKey(
m_Product, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(
Prescription, on_delete=models.SET_NULL, null=True)
quantity = models.IntegerField(default=0, null=True, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
s = m_Product.objects.select_related('orderitem').filter('name').values('quantity').annotate(sum = Sum('quantity'))
Вы можете аннотировать m_PRoduct
с Sum
из quantity
связанных OrderItem
с помощью:
from django.db.models import Sum
m_Product.objects.annotate(
total_ordered=Sum('orderitem__quantity')
)
Возникающие при этом m_Product
будут иметь дополнительный атрибут .total_ordered
, который содержит сумму quantity
связанных OrderItem
с ними
В нем также будут содержаться m_Product
, которые вообще не были заказаны. Мы можем опустить эти продукты с помощью:
from django.db.models import Sum
m_Product.objects.filter(
orderitem__isnull=False
).annotate(
total_ordered=Sum('orderitem__quantity')
)
Если у продуктов нет уникального имени, это означает, что одно и то же имя продукта может встречаться несколько раз с разными total_ordered
. Но обычно это не является проблемой: мы хотим знать общее количество заказов продукта, а не общее количество заказов продуктов, которые каким-то образом имеют одинаковое название, поскольку иногда для одного и того же названия существуют разные продукты.
Если вы действительно хотите получить сумму количеств по каждому наименованию товара, мы можем работать с:
from django.db.models import Sum
m_Product.objects.values('name').filter(
orderitem__isnull=False
).annotate(
total_ordered=Sum('orderitem__quantity')
).order_by('name')