У меня проблемы с получением нескольких ограничений для работы (в postgres, если это имеет значение). Вот мета:
class Meta:
constraints = [
CheckConstraint(
check=(Q(target_value__gt=0) & ~Q(target_metric=DEFAULT)) |
(Q(enabled=False) |
Q(status=IMPORTING) |
Q(status=IMPORT_FAILURE)),
name="positive_target_value",
)
]
Мне бы это показалось достаточно простым, но в итоге он не работает. Вот сгенерированный SQL (извлеченный из самой базы данных):
target_value > 0.0::double precision AND NOT target_metric::text = 'DEFAULT'::text OR enabled = false OR status = 20 OR status = 30
И вот доказательство того, что он действительно должен работать (извлечено из консоли django, где условия копируются из миграции файл):
Folder.objects.filter(models.Q(models.Q(('target_value__gt', 0), models.Q(_negated=True, target_metric='DEFAULT')), ('enabled', False), ('status', 20), ('status', 30), _connector='OR'))
web_1 | Out[5]: <QuerySet [<Folder: aDifferentFolder>]>
Folder.objects.filter(models.Q(models.Q(('target_value__gt', 0), models.Q(_negated=True, target_metric='**SOMETHING DIFFERENT**')), ('enabled', False), ('status', 20), ('status', 30), _connector='OR'))
web_1 | Out[7]: <QuerySet [< Folder: Folder aDifferentFolder >, < Folder: Folder thisFolderShouldNotHaveBeenCreted>]>
У кого-нибудь есть предложения? Кстати, я также попытался поменять первое условие на второе, эффективно поместив AND в конец запроса, но, похоже, это не дало никакого эффекта.
Большое спасибо.