Django 在 BooleanField 上进行注释

2024-01-11

我有以下型号:

class Foo(models.Model):
    pass

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

我想得到全部foo带有注释的对象,如果所有bar与关联的对象foo对象有is_successful as True

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

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

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

foo = foos[0]

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

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

我的问题是如何使这个查询集在 PostgreSQL 中工作而不转换我的is_successful字段到IntegerField?

Thanx


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

https://docs.djangoproject.com/en/1.8/ref/models/conditional-expressions/#case 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()
    ))

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 在 BooleanField 上进行注释 的相关文章

随机推荐