我有这样的查询
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的情况下,我得不到获取值的信息。
能帮我吗?
谢谢!
答案 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
因此,这是在数据库上完成的,通常速度更快,而且从数据库传输到应用程序的数据量也大大减少。