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)',
}