Python Django QuerySet:计算值的附加字段';发生

Python Django QuerySet:计算值的附加字段';发生,python,sql,django,django-queryset,extra,Python,Sql,Django,Django Queryset,Extra,我有一个包含100个项目的QuerySet对象,对于每个项目,我需要知道特定的contract\u number在contract\u number字段中出现了多少次 预期产出示例: [{'contract_number': 123, 'contract_count': 2}, {'contract_number': 456, 'contract_count': 1} ...] 这意味着整个合同编号字段的值123出现2次 重要事项:我无法减少项目的数量,因此分组在这里不起作用 与此对应的SQL

我有一个包含100个项目的
QuerySet
对象,对于每个项目,我需要知道特定的
contract\u number
contract\u number
字段中出现了多少次

预期产出示例:

[{'contract_number': 123, 'contract_count': 2}, {'contract_number': 456, 'contract_count': 1} ...]
这意味着整个
合同编号
字段的值123出现2次

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

与此对应的SQL是一个附加字段
合同计数
,如下所示:

 SELECT *,
 (SELECT count(contract_number) FROM table where t.contract_number = contract_number) as contract_count
FROM table as t
问题是如何使用Python对象实现这一点。经过一些研究,我发现对于更复杂的查询,应该使用。下面是我的一次尝试,但结果并不是我所期望的

    queryset = Tracker.objects.extra(
    select={
        'contract_count': '''
        SELECT COUNT(*)
        FROM table
        WHERE contract_number = %s
        '''
    },select_params=(F('contract_number'),),)
My
models.py

class Tracker(models.Model):
    contract_number = models.IntegerField()
编辑:
我的问题的解决方案是

您可以使用如下注释:

from django.db.models import Count
Tracker.objects.values('contract_number').annotate(contract_count=Count('contract_number')).order_by()

有趣的是,我得到的不是预期的输出,而是值:每个项目1。当然,有些合同是duplicated@Supergator我想这是因为默认的顺序。尝试添加
order\u by()
,就像在我的更新中一样。请看这里的详细信息:谢谢,这是真的,我之前在查询中进行了一些排序。现在,我得到了很好的计数值,问题是,它减少了输出中的项目数量-如果是项目,我必须保持原始数量。你知道如何在不减少项目数量的情况下获得计数值吗?这正是我需要的,非常感谢你的支持