class Forecast(Model):
id = UUID()
type = StringField()
approved = BooleanField()
我想通过在已批准的字段上应用“逻辑与”来对字段 type
进行分组。假设注释字段是 all_approved
。 all_approved
如果该类型的所有项都为 True,则应为 True,如果至少有一项为 False,则应为 false。
所以最后在我的查询集中我想要两个字段type
,all_approved
。
我怎样才能做到这一点?
我尝试了一些基于 this answer 的东西, 但什么也得不到。
编辑:
当我尝试该答案中给出的内容时,它没有执行“逻辑与”。相反,对于每个 type
,它只提供两项,一项 all_approved
为 True,另一项 all_approved
为 False。我想要每个 type
一个项目。
我也不明白为什么这个答案应该有效。如果在分组时应该做“逻辑与”或“逻辑或”,它在哪里指定。
最佳答案
其他解决方案:您可以尝试将所有 approved
与 approved=True
进行比较
from django.db.models import Count, Case, When, BooleanField
Forecast.objects.values(
'type'
).annotate(
cnt_app=Count(Case(When(approved=True, then=1)))
).annotate(
all_approved=Case(
When(cnt_app=Count('approved'), then=True),
default=False,
output_field=BooleanField()
)
).values('type', 'all_approved')
在哪里
Count(Case(When(approved=True, then=1)))
为我们提供了该类型已批准且状态为 True 的计数,
Count('approved')
为我们提供了该类型的总计数,
如果值相等则 all_approved 为 True 否则为 False
关于Django 在 bool 字段上注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55650557/