返回查询集时如何仅计算()特定字段上的不同值

时间:2021-03-31 15:10:07

标签: django

我有一个函数,它返回一个查询集,它是一个记录列表,我想返回它所做的记录的 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)

1 个答案:

答案 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() 调用,数据库只会比较指定的字段名。