我正在基于复杂的数据模型构建复杂的查询集。
查询集必须返回带有注释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
,
解决整个问题的更好方法?)
答案 0 :(得分:1)
一种简单的方法(即使非常不确定)也可以将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进行了测试。
但是,必须有更好的方法,pleeeease。