我有一个函数,它返回一个查询集,它是一个记录列表,我想返回它所做的记录的 count() 但我只想计算来自特定字段的不同值。我可以在 SQLite 查询中轻松完成此操作,但在 Django 中似乎无法实现。
这是有效的 SQLite 查询,但我需要在 Django 视图中执行此操作:
SELECT DISTINCT Host FROM inventory_scandata WHERE Project_Assigned LIKE '%Hooli%' AND Environment LIKE '%PROD%'
这是我当前返回非不同计数的函数:
def HooliProject(request):
prodAssets = ScanData.objects.filter(Q(Project_Assigned__icontains="Hooli_1") & (Q(Environment__icontains="PROD")))
prodAssetsHosts = prodAssets.distinct()
prodAssetsDistinct = prodAssetsHosts.distinct()
prodAssetsCount = prodAssetsDistinct.count()
context = {
'prodAssets': prodAssets,
'prodAssetsCount': prodAssetsCount
}
return render(request, 'HooliProject.html', context)
答案 0 :(得分:1)
如果您只想count()
Host
字段的不同值,您可以使用values('Host').distinct().count()
,因此您将distinct()
与{{ 3}}。
ScanData.objects.filter(
Q(Project_Assigned__icontains="Hooli_1") & Q(Environment__icontains="PROD")
).values('Host').distinct().count()
以下是您的代码,并在需要时添加了内容。
def HooliProject(request):
prodAssets = ScanData.objects.filter(Q(Project_Assigned__icontains="Hooli_1") & (Q(Environment__icontains="PROD")))
prodAssetsHosts = prodAssets.values('Host') # <--- I've changed here ;D
prodAssetsDistinct = prodAssetsHosts.distinct()
prodAssetsCount = prodAssetsDistinct.count()
context = {
'prodAssets': prodAssets,
'prodAssetsCount': prodAssetsCount
}
return render(request, 'HooliProject.html', context)
此外,如果您使用的是 PostgreSQL,则可以使用 distinct('Host').count()
。
仅在 PostgreSQL 上,您可以传递位置参数 (*fields) 以指定应应用 DISTINCT 的字段的名称。这转换为 SELECT DISTINCT ON SQL 查询。这就是不同之处。对于普通的 distinct() 调用,数据库在确定哪些行不同时比较每行中的每个字段。对于指定字段名的 distinct() 调用,数据库只会比较指定的字段名。