Для этого вы можете переопределить метод Model.clean(..)
[Django-doc] . Если вы используете ModelForm
[Django-doc] , то он автоматически вызовет .clean()
в экземпляре модели, чтобы проверить, выполнено ли ограничение.
from django.db import models
from django.utils import timezone
class MyModel(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
def <b>clean</b>(self):
super().clean()
if not (timezone.now() <= self.start <= self.end):
raise ValidationError('Invalid start and end datetime')
Начиная с django-2.2 , вы можете использовать constraints
[Django-doc] в Meta
:
# since Django-2.2
from django.db import models
from django.db.models import F, Q
from django.db.models.functions import Now
class MyModel(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
def clean(self):
# ...
pass
class Meta:
<b>constraints</b> = [
models.CheckConstraint(
check=Q(start__lte=F('end'), start__gte=Now()),
name='correct_datetime'
),
]
Учитывая, что система баз данных поддерживает это, ограничения будут применяться и на уровне базы данных.