Django — Как суммировать связанное поле модели с фильтром в аннотации?

#python #django

#python #django

Вопрос:

Я столкнулся с этой проблемой. У меня есть 2 модели с отношениями, как показано ниже, я попытался просуммировать всю ЦЕНУ каждого автора с помощью filter: sale_type=sl01, и я застрял на весь день. Может кто-нибудь указать правильный путь для его решения, заранее большое спасибо,

 from django.db.models import Q, Subquery, OuterRef

    SALE_CHOICES = (
        ("sl01", "sl01"),
        ("sl02", "sl02")
    )
    
    
    class Author(models.Model):
        created = models.DateTimeField(auto_now_add=True)
        name = models.CharField(max_length=50, default='', null=True)
        password = models.CharField(max_length=20, default='', null=True)
        phone = models.CharField(max_length=15, default='', null=True)
        address = models.CharField(max_length=100, default='', null=True)
    
    
    class Sale(models.Model):
        created = models.DateTimeField(auto_now_add=True)
        author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True)
        price = models.DecimalField(max_digits=10, decimal_places=2, null=True)
        sale_type = models.CharField(choices=SALE_CHOICES, default='sl01', max_length=10)

    data = Author.objects.annotate(total_amount=Subquery(Sale.objects.filter(author=OuterRef('author'), sale_type='sl01').aggregate(total_amount=Sum('price'))['total_amount']))
 

Ответ №1:

Вы можете передать filter аргумент ключевого слова в функции агрегирования для фильтрации по агрегациям. См. раздел Фильтрация аннотаций [Документы Django]

 from django.db.models import Q, Sum


data = Author.objects.annotate(total_amount=Sum('sale__price', filter=Q(sale__sale_type='sl01')))