我一直面临这个问题。我有 2 个具有如下关系的模型,我试图用过滤器总结每个作者的所有 PRICE: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']))
答案 0 :(得分:2)
您可以将 filter
关键字参数传递给聚合函数以过滤聚合。见Filtering on annotations [Django docs]
from django.db.models import Q, Sum
data = Author.objects.annotate(total_amount=Sum('sale__price', filter=Q(sale__sale_type='sl01')))