gpt4 book ai didi

Django 在 BooleanField 上注释

转载 作者:IT王子 更新时间:2023-10-29 06:23:18 28 4
gpt4 key购买 nike

我有以下模型:

class Foo(models.Model):
pass

class Bar(models.Model):
foo = models.ForeignKey(Foo)
is_successful = models.BooleanField()

如果与 foo 对象关联的所有 bar 对象都具有 is_successful,我想获取所有带有注释的 foo 对象True

到目前为止我的查询集是:

foos = Foo.objects.all().annotate(all_successful=Min('bar__is_successful'))

all_successful 注释的想法是,如果所有 is_successful 行的最小值是 1,那么它们都必须是 True (假设 0False 并且 1True)。所以知道我可以像这样使用查询集:

foo = foos[0]

if foo.all_successful == 1:
print 'All bars are successful'
else:
print 'Not all bars are successful'

这在 sqlite 中运行良好,但在 PostgreSQL 中失败,因为 PostgreSQL 无法在 bool 列上执行 MIN 聚合。我猜这在 sqlite 中有效,因为 sqlite 将 bool 值视为整数,因此它可以执行聚合。

我的问题是如何在不将我的 is_successful 字段转换为 IntegerField 的情况下让这个查询集在 PostgreSQL 中工作?

谢谢

最佳答案

我知道这是一个老问题,但我最近遇到了这个问题。 Django v1.8 现在内置了对 case/when 的支持,因此您可以使用 ORM 而不是使用自定义 SQL。

https://docs.djangoproject.com/en/1.8/ref/models/conditional-expressions/#case

Foo.objects.annotate(
all_successful=Case(
When(bar__is_successful=False, then=False),
When(bar__is_successful=True, then=True),
default=False,
output_field=BooleanField()
))

我还没有尝试过,但在最近的一个项目中,类似的东西对我有用。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com