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



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

预期输出示例:

[{'contract_number': 123, 'contract_count': 2}, {'contract_number': 456, 'contract_count': 1} ...]

这意味着值 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

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

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

我的models.py

class Tracker(models.Model):
contract_number = models.IntegerField()

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

您可以使用这样的注释:

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

解决方案:

counttraker=Traker.objects.values('contract_number').annotate(Count('contract_number'))
subquery=counttraker.filter(contract_number=OuterRef('contract_number').values('contract_number__count')[:1]
traker=Traker.objects.annotate(count=Subquery(subquery))

相关内容

  • 没有找到相关文章

最新更新