如何获取queryset的不同值?

时间:2019-06-05 10:32:32

标签: python django python-3.x

我有这样的查询

query1 = A.objects.filter(a=a).values('color__red')

调试器告诉我:

<QuerySet [{'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}]>

我想计算color__red的不同值的数量(在我的情况下为1,因为color__red = 'yes',但有时可以为2)

我知道在数组的情况下,我必须做一个len(list(set(array))),但是在queryset的情况下,我得不到获取值的信息。

能帮我吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以将.distinct() [Django-doc]添加到查询集:

query1 = A.objects.filter(a=a).values('color__red').distinct()

如果要计数个不同的对象,可以使用.count() [Django-doc]

n_colors = A.objects.filter(a = a).values('color__red').distinct().count()

您还可以在此处定义.aggregate(..) [Django-doc],并在此处使用Count expression [Django-doc]

n_colors = A.objects.filter(a=a).aggregate(n_colors = Count('color__red', distinct=True))['n_colors']

然后将在数据库级别执行唯一性过滤器。因此,Django将构造一个查询,例如:

SELECT DISTINCT app_color.red
FROM app_a
LEFT OUTER JOIN app_color ON app_color.a_id = a.app_a.id
WHERE app_a.a = a

,对于.count()查询:

SELECT COUNT(*)
FROM 
    (SELECT DISTINCT app_color.red
     FROM app_a
     LEFT OUTER JOIN app_color ON app_color.a_id = a.app_a.id
     WHERE app_a.a = a)

使用总计,我们得到:

SELECT COUNT(DISTINCT app_color.red) AS n_colors
FROM app_a
LEFT OUTER JOIN app_color ON app_color.a_id = a.app_a.id
WHERE app_a.a = a

因此,这是在数据库上完成的,通常速度更快,而且从数据库传输到应用程序的数据量也大大减少。