Django CheckConstraint: элементы обратного просмотра ForeignKey не должны быть пустыми - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть следующие модели:

class Container(models.Model):
    ...
    class Meta:
        constraints = [
            models.CheckConstraint(
                 check=~Q(elements=None),
                 name='container_must_have_elements'
            ),
        ]

class Element(models.Model):
    container = models.ForeignKey(Container),
        related_name='elements',
        on_delete=models.CASCADE
    )

Я хочу применить ограничение, согласно которому каждый объект Container должен иметь хотя бы один Element, ссылающийся на него через отношение внешнего ключа.

Как видите, я уже добавил проверочное ограничение. Однако оператор отрицания ~ на объекте Q представляется запрещенным. Я получаю django.db.utils.NotSupportedError: cannot use subquery in check constraint, когда пытаюсь применить сгенерированную миграцию.

Без оператора отрицания ограничение кажется действительным (оно не выполняется только из-за ошибки целостности данных).

Есть ли иначе я могу express это ограничение, чтобы оно поддерживалось CheckConstraint? (Например, есть ли способ проверить, не является ли набор elements не пустым?)

1 Ответ

0 голосов
/ 12 февраля 2020

Я отвечу на свой вопрос, суммируя комментарии к этому вопросу.

Ограничение проверки предназначено для проверки каждой строки таблицы на наличие условия, которое учитывает только саму строку и не присоединяется к ней. другие таблицы для этого.

Придерживаясь SQL, можно сформулировать расширенные ограничения, включая другие таблицы, определив функцию в SQL и вызвав ее из ограничения.

CheckConstraint представленный в Django 2.2 поддерживает только условия для самой таблицы, используя Q объекты. Разрабатываемая версия документации указывает, что помимо Q объектов будет поддерживаться логический Expression s. Это пока недоступно в Django 3.0, но в будущих версиях.

...