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进行测试


但是一定有更好的方法,请放心。

为什么不使用
值呢?这个额外的字段是如何破译你的代码的?