Как получить данные из родительской таблицы через дочернюю таблицу

Я хочу получить все названия продуктов, которые были заказаны и сохранены в таблице 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')
Вернуться на верх