Несколько ограничений дБ в модели Django не работают - PullRequest
0 голосов
/ 03 апреля 2020

У меня проблемы с получением нескольких ограничений для работы (в 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 в конец запроса, но, похоже, это не дало никакого эффекта.

Большое спасибо.

1 Ответ

0 голосов
/ 09 апреля 2020

Виновным было то, что postgres возвращает true для ограничения также, если значение равно null, так что теперь я знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...