我有Django代码如下
qs = Result.objects.only('time') 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"."data"
正如您所看到的,GROUP子句以我想要的字段(id)开头,但随后它也列出了所有其他字段。有没有办法说服Django不要像这样指定所有单独的字段?
正如您所看到的,即使使用.only('time'),也不能阻止Django列出所有其他字段,但只在这个GROUP子句中。
我想这样做的原因是为了避免the issue described here,当涉及JSON字段时,PostgreSQL不支持注释。我不想放弃对本地JSON的支持(所以我实际上并不使用django-jsonfield)。如果我不引用"myapp_result"."data" (模型上唯一的JSON字段)手动发出它,查询就能正常工作。所以如果我能说服Django不提这个问题,我就没事了!
发布于 2015-01-27 19:09:05
only只延迟某些字段的加载,即允许延迟加载大字段或未使用的字段。通常不应该使用它,除非您清楚地知道自己在做什么以及为什么需要它,因为它只不过是一个性能提升器,通常会因为使用不当而降低性能。
您要寻找的是values() (或values_list()),它实际上排除了某些字段,而不只是延迟加载。这将返回一个字典(或列表),而不是一个模型实例,但这是告诉Django不要考虑其他字段的唯一方法:
qs = (Result.objects.filter_by(organisation_id=1)
.values('time').annotate(Count('id')))https://stackoverflow.com/questions/28177925
复制相似问题