Django:从queryset中删除辅助注释
我正在一个复杂的数据模型上构建一个复杂的查询集。 查询集必须返回所选模型对象Django:从queryset中删除辅助注释,django,django-models,Django,Django Models,我正在一个复杂的数据模型上构建一个复杂的查询集。 查询集必须返回所选模型对象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 Val
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'))))
如何使用ann
返回qs
,而不使用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进行测试
但是一定有更好的方法,请放心。为什么不使用
值呢?这个额外的字段是如何破译你的代码的?