我有以下型号:
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_successful
rows 为 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(使用前将#替换为@)