Django 对布尔字段进行注释

Nit*_*hin 2 django postgresql django-queryset

class Forecast(Model):
    id = UUID()
    type = StringField()
    approved = BooleanField()
Run Code Online (Sandbox Code Playgroud)

type我想通过在批准的字段上应用“逻辑与”来对该字段进行分组。假设带注释的字段是all_approved. all_approved如果该类型的所有项目都为 True,则应为 True;如果至少有一项为 False,则应为 false。

所以最后在我的查询集中我想要有两个字段type, all_approved

我怎样才能做到这一点?

我根据这个答案尝试了一些东西,但什么也没得到。

编辑:

当我尝试该答案中给出的内容时,它没有执行“逻辑与”。相反,对于每个type项目,它只给出两项,一项为all_approvedTrue,另一项all_approved为 False。我想要每个项目一个type

我也不明白为什么这个答案应该有效。在哪里指定分组时是否应该执行“逻辑与”或“逻辑或”。

小智 7

其他解决方案:您可以尝试将所有approvedapproved=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')
Run Code Online (Sandbox Code Playgroud)

在哪里

Count(Case(When(approved=True, then=1)))为我们提供该类型状态为 True 的已批准计数,

Count('approved')给我们该类型的所有总数,

如果值相等,则 all_approved 为 True,否则为 False