Возврат месячного значения продаж в Django

Ниже приведены несколько простых моделей

class Stamping(models.Model):
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True

class Product(Stamping):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_product')
    name = models.CharField(max_length=300, unique=True)
    price = models.FloatField()

class GroupProductOrder(Stamping):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='group_product_orders')
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    quantity = models.IntegerField()

class Order(Stamping):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders')
    fulfilled = models.BooleanField(default=False)
    products = models.ManyToManyField(GroupProductOrder, blank=True)

    @property
    def total_price(self):
        cost = 0
        for product in self.products.all():
            cost += product.total_price
        return cost

Теперь я хочу запросить базу данных и вернуть некоторые детали на ежемесячной основе. Такие данные, как общее количество продаж за каждый месяц и сумма продаж за каждый месяц. Я пробовал использовать annotate, но, похоже, он не может передать свойство модели. Какой лучший способ решить эту проблему? Пример ожидаемого результата: {'month': 'October', 'count': 5, 'total': 15}

Вы можете запрашивать и аннотировать с помощью следующего утверждения:

from django.db.models import Sum, F, FloatField
from django.db.models.functions import ExtractMonth

output = (
    Order.objects
    .annotate(
        month=ExtractMonth("created")
    )
    .values("month")
    .annotate(
        count=Sum("products__quantity"),
        total=Sum(
            F("products__quantity") * F("products__product__price"),
            output_field=FloatField()
        )
    )
    .order_by("month")
)
Вернуться на верх