Django:从queryset

时间:2018-08-16 09:37:27

标签: 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 Value('some')),
    When(condition=Q(aux_gt=0),
         then Value('other'))))

如何在返回qs而不返回ann的情况下返回aux

(或者:如果aux是一个计数,并且ann区分零和非零aux, 解决整个问题的更好方法?)

1 个答案:

答案 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。