返回查询集时如何仅对特定字段上的不同值进行 count()

问题描述 投票:0回答:2

我有一个返回查询集的函数,该查询集是一个记录列表,我想返回它所执行的记录的 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)
django
2个回答
1
投票

如果您只想

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()调用,数据库将仅比较指定的字段名称。


0
投票

要在 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()
© www.soinside.com 2019 - 2024. All rights reserved.