Django 在 bool 字段上注释

标签 django postgresql django-queryset

class Forecast(Model):
    id = UUID()
    type = StringField()
    approved = BooleanField()

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

所以最后在我的查询集中我想要两个字段typeall_approved

我怎样才能做到这一点?

我尝试了一些基于 this answer 的东西, 但什么也得不到。

编辑:

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

我也不明白为什么这个答案应该有效。如果在分组时应该做“逻辑与”或“逻辑或”,它在哪里指定。

最佳答案

其他解决方案:您可以尝试将所有 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')

在哪里

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

Count('approved') 为我们提供了该类型的总计数,

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

关于Django 在 bool 字段上注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55650557/

相关文章:

python - 根据模型字段限制查询集结果,有更好的方法吗?

javascript - chrome 上的 contentType 错误

python - 错误为 "invalid literal for int() with base 10"的查询字符串

python - Django 1.11 中的时差

oracle - 按 PostgreSQL 中的主键位置对列进行排序

java - 连接 Amazon RDS 上的顶级 PostgreSQL 9.3.1 时 Hibernate/JDBC 挂起

Django 在页面之间传递查询集

django - 如何在 Django 查询中执行 OR 过滤器?

php - Django 唯一 URL 重定向问题

ruby - 为什么 psql -version 输出和连接到我的应用程序的 psql 版本之间存在差异?