Django QuerySet:用于计数值出现次数的附加字段

Sup*_*tor 4 python sql django django-queryset extra

我有一个包含 100 个项目的对象,对于每个项目,我需要知道特定内容在该字段中出现的QuerySet次数。contract_numbercontract_number

预期输出示例:

[{'contract_number': 123, 'contract_count': 2}, {'contract_number': 456, 'contract_count': 1} ...]
Run Code Online (Sandbox Code Playgroud)

这意味着值 123 在整个contract_number字段中出现了 2 次。

重要的是:我无法减少项目的数量,因此分组在这里不起作用。

与此等效的 SQL 将是一个附加字段,contract_count如下所示:

 SELECT *,
 (SELECT count(contract_number) FROM table where t.contract_number = contract_number) as contract_count
FROM table as t
Run Code Online (Sandbox Code Playgroud)

问题是如何使用 Python 对象来做到这一点。经过一些研究,我发现对于更复杂的查询,应该使用Queryset 额外方法。以下是我的尝试之一,但结果不是我所期望的

    queryset = Tracker.objects.extra(
    select={
        'contract_count': '''
        SELECT COUNT(*)
        FROM table
        WHERE contract_number = %s
        '''
    },select_params=(F('contract_number'),),)
Run Code Online (Sandbox Code Playgroud)

我的models.py

class Tracker(models.Model):
    contract_number = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

编辑: 我的问题的解决方案是Subquery()

nev*_*ner 5

您可以像这样使用注释:

from django.db.models import Count
Tracker.objects.values('contract_number').annotate(contract_count=Count('contract_number')).order_by()
Run Code Online (Sandbox Code Playgroud)