У меня есть следующие модели:Джанго аннотации на BooleanField
class Foo(models.Model):
pass
class Bar(models.Model):
foo = models.ForeignKey(Foo)
is_successful = models.BooleanField()
Я хотел бы получить все foo
объекты с аннотациями, если все bar
объектов, связанных с foo
объектом имеет is_successful
в True
So far мой запрос установлен:
foos = Foo.objects.all().annotate(all_successful=Min('bar__is_successful'))
Идея для all_successful
состоит в том, что если минимальное значение всех строк is_successful
равно 1, то все они должны быть True
(при условии, что 0
- False
и 1
- True
). Так, зная, что я могу использовать QuerySet так:
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 обрабатывает bools как целые числа, поэтому он может выполнять агрегат.
Вопрос: как я могу сделать эту работу в PostgreSQL без преобразования поля is_successful
в IntegerField
?
Thanx
Спасибо.Это действительно возможно в Django, так что ваш вопрос был принят. – miki725
это предпочтительный подход сейчас, хороший момент! спасибо за ваш вклад! – furins
Ваш синтаксис легче следовать, чем фактическая документация, спасибо! Отсутствует окончательный ')' в кодовом блоке. Кроме того, добавьте окончательный kwarg 'output_field = BooleanField()' в вызов 'Case()'. – AlanSE