gpt4 book ai didi

Django GROUP BY 包括不必要的列?

转载 作者:行者123 更新时间:2023-11-29 11:47:48 25 4
gpt4 key购买 nike

我有如下Django代码

qs = Result.objects.only('时间')
qs = qs.filter(organisation_id=1)
qs = qs.annotate(Count('id'))

它被翻译成以下 SQL:

SELECT "myapp_result"."id", "myapp_result"."time", COUNT("myapp_result"."id") AS "id__count"FROM "myapp_result"WHERE "myapp_result"."organisation_id"= 1 GROUP BY "myapp_result"."id", "myapp_result"."organisation_id", "myapp_result"."subject_id", "myapp_result"."device_id", "myapp_result"."time", "myapp_result"."tester_id", "myapp_result"."数据"

如您所见,GROUP BY 子句以我想要的字段 (id) 开头,然后它继续列出所有其他字段。有什么办法可以说服 Django 不要像这样指定所有单独的字段吗?

如您所见,即使使用 .only('time') 也不会阻止 Django 列出所有其他字段,但仅限于此 GROUP BY 子句。

我这样做的原因是为了避免 the issue described here当涉及 JSON 字段时,PostgreSQL 不支持注释。我不想放弃 native JSON 支持(所以我实际上并没有使用 django-jsonfield)。如果我在不引用 "myapp_result"."data"(模型上唯一的 JSON 字段)的情况下手动发出查询,查询就可以正常工作。所以如果我能说服 Django 不要引用它,我会没事的!

最佳答案

only 仅延迟某些字段的加载,即它允许延迟加载大字段或未使用的字段。通常不应使用它,除非您确切地知道自己在做什么以及为什么需要它,因为它只不过是一种性能助推器,而不是经常因使用不当而降低性能。

您要查找的是 values()(或 values_list()),它实际上排除了某些字段,而不仅仅是延迟加载。这将返回字典(或列表)而不是模型实例,但这是告诉 Django 不要考虑其他字段的唯一方法:

qs = (Result.objects.filter_by(organisation_id=1)
.values('time').annotate(Count('id')))

关于Django GROUP BY 包括不必要的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28177925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com