我有这个查询,例如
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 的不同值的数量(在我的例子中,它是一个,因为 color__red = 'yes'
但有时它可能是 2)
我知道在数组的情况下我必须执行 len(list(set(array)))
但在查询集的情况下我无法获取值。
你能帮我一下吗?
谢谢!
最佳答案
您可以添加.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
因此,这是在数据库中完成的,通常速度更快,而且从数据库传输到应用程序的数据量显着减少。
关于python - 如何获取查询集的不同值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56458765/