外键值的Django Sum

Django Sum of foreing key values

我有两个 Django 模型。 ClientGroup 具有一对多关系(客户端可以分配多个组)。模型 Group 包含三个整数字段 sc_donesc_analyzesc_error。我想要做的是创建 Django 查询,其中 return 排名前 10 Clients 的总和数最多 sc_donesc_analyzesc_error他们所有的团体。模型看起来像:

class Client(models.Model):
    name = models.CharField(_("name"), max_length=255, blank=False, null=True)
    ...

class Group(models.Model):
    client = models.ForeignKey(Client, on_delete=models.SET_NULL, null=True, blank=True)
    sc_done = models.PositiveIntegerField(blank=True, null=True)
    sc_analyze = models.PositiveIntegerField(blank=True, null=True)
    sc_error = models.PositiveIntegerField(blank=True, null=True)
    ...

例如,如果 client-1 属于两个组:group-1group-2,查询将 return 类似于:{'client': 'client-1', 'sc_count': X} 其中 X是 group-1group-2sc_donesc_analyzesc_error 的总和。

不确定这个问题是否可以理解,请询问是否需要任何说明。

from django.db.models import F, Sum

Client.objects.values(
    'name'
).annotate(
    sc_done_sum=Sum('group__sc_done'),
    sc_analyze_sum=Sum('group__sc_analyze'),
    sc_error_sum=Sum('group__sc_error'),
    sc_count=F('sc_done_sum')+F('sc_analyze_sum')+F('sc_error_sum'),
    client=F('name'),
).values(
    'client',
    'sc_count',
).order_by('-sc_count')[:10]

预期结果:

[{'client': 'client-1', 'sc_count': 100},
 ...
 {'client': 'client-2', 'sc_count': 90}]