Django前键值总和

时间:2019-12-09 10:48:20

标签: python django django-models django-queryset django-orm

我有两个Django模型。一对多关系的ClientGroup(客户可以分配多个组)。模型Group包含三个整数字段sc_donesc_analyzesc_error。我想做的是创建Django查询,该查询返回所有组中总和Clientssc_donesc_analyze最高的前10个sc_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,则查询将返回类似:{'client': 'client-1', 'sc_count': X},其中X是{{1 }},sc_donesc_analyze中的sc_errorgroup-1

不确定此问题是否可以理解,请询问是否需要澄清。

1 个答案:

答案 0 :(得分:1)

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}]