Django одно из 2 полей не должно быть пустым - PullRequest
0 голосов
/ 31 октября 2018

У меня есть модель, похожая на эту:

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    field1= models.IntegerField(null=True)
    field2 = models.IntegerField(null=True)

Хотя бы одно из полей field1 или field2 не должно быть пустым. Как мне это проверить в модели?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Model.clean

Обычно такие тесты пишут в Model.clean [Django-doc] :

from django.core.exceptions import ValidationError

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    field1= models.IntegerField(null=True)
    field2 = models.IntegerField(null=True)

    def clean(self):
        super().clean()
        if self.field1 is None and self.field2 is None:
            raise ValidationError('Field1 or field2 are both None')

Обратите внимание, что этот чистый метод не проверен по умолчанию при .save() модели. Обычно он вызывается только ModelForm s, созданным поверх этой модели. Вы можете установить .save() метод , например, как здесь , чтобы обеспечить проверку при .save() экземпляре модели, но все же есть способы обойти через ORM.

django-db-constraints (не поддерживается некоторыми базами данных)

Если ваша база данных поддерживает это (например, MySQL просто игнорирует ограничения CHECK ), SQL предлагает синтаксис для добавления дополнительных ограничений и пакет Django django-db-constraints [GitHub] предоставляет некоторые инструменты для определения таких ограничений, например:

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    field1= models.IntegerField(null=True)
    field2 = models.IntegerField(null=True)

    class Meta:
        db_constraints = {
            'field_null': 'CHECK (field1 IS NOT NULL OR field2 IS NOT NULL)',
        }
0 голосов
/ 31 октября 2018

Вы можете использовать Model.clean() метод:

def clean(self):
    if self.field1 is None and self.field2 is None:
        raise ValidationError(_('field1 or field2 should not be null'))

См. https://docs.djangoproject.com/en/2.1/ref/models/instances/#django.db.models.Model.clean

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