python - 如何获取查询集的不同值?

标签 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 的不同值的数量(在我的例子中,它是一个,因为 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/

相关文章:

javascript - Django Angularjs 如何调用具有特定Id的Http请求

python - 如何自动选择和处理/root/facedetect 目录中的每个图像而不是选择特定图像

python - 如何使用 python 写入 .csv 文件

java - 通过 YouTube 数据 API 进行编程注释

python - 在 django 模板中访问查询集对象

python - 在 pandas 中,我如何为 datetime 列分组 weekday() ?

python - 从 dict 生成 django 2.0 模型

python - 读取彩色数字图像是什么数字以进行控制台

python - Flask-SQLAlchemy 在父表(关系表)中添加不必要的行

python - 以某种方式迭代素数