首页 > 解决方案 > 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'))))

如何返回qsann但没有aux

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

标签: djangodjango-models

解决方案


丑陋的黑客:

一个简单但非常不优雅的方法是重命名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 进行测试。

但一定有更好的办法,拜托。


推荐阅读