django - Django:从查询集中删除辅助注释
问题描述
我正在一个复杂的数据模型上构建一个复杂的查询集。查询集必须返回A
带有注释的模型对象选择ann
。
对于计算ann
,我需要一个辅助注释aux
,但aux
不允许在查询集的最终结果中存在。
qs = A.objects.filter(...) # complicated
qs = qs.annotate(aux=...) # complicated
qs = qs.annotate(ann=Case(
When(condition=Q(aux=0),
then Value('some')),
When(condition=Q(aux_gt=0),
then Value('other'))))
如何返回qs
有ann
但没有aux
?
(或者:如果aux
是一个计数并ann
区分零和非零aux
,有没有更好的方法来解决整个问题?)
解决方案
丑陋的黑客:
一个简单但非常不优雅的方法是重命名aux
以被调用ann
。这样,第二个注释将覆盖第一个注释,而第一个注释将不再存在于输出中。
qs = A.objects.filter(...) # complicated
qs = qs.annotate(ann=...) # complicated
qs = qs.annotate(ann=Case(
When(condition=Q(ann=0),
then Value('some')),
When(condition=Q(ann_gt=0),
then Value('other'))))
这似乎有效。在 SQlite 和 PostgreSQL 上使用 Django 1.11 进行测试。
但一定有更好的办法,拜托。