我有一个返回查询集的函数,该查询集是一个记录列表,我想返回它所执行的记录的 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)
如果您只想
count()
Host
字段的不同值,则可以使用 values('Host').distinct().count()
,因此您将 distinct()
与 values()
结合使用。
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 上,您可以传递位置参数(*字段)以指定应应用 DISTINCT 的字段名称。这将转换为 SELECT DISTINCT ON SQL 查询。这就是区别。对于正常的 unique() 调用,数据库在确定哪些行不同时会比较每行中的每个字段。对于指定字段名称的distinct()调用,数据库将仅比较指定的字段名称。
要在 SQLite 中获取不同的值,您需要使用 set()。检查下面的例子。
queryset = set(ScanData.objects.values_list('Project_Assigned', flat=True).filter(Project_Assigned__icontains='keyword'))
你还可以这样做:
queryset = set(ScanData.objects.values_list('Project_Assigned', flat=True)).count()