您可以为此覆盖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 clean(self):
super().clean()
if not (timezone.now() <= self.start <= self.end):
raise ValidationError('Invalid start and end datetime')
Run Code Online (Sandbox Code Playgroud)
从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:
constraints = [
models.CheckConstraint(
check=Q(start__lte=F('end'), start__gte=Now()),
name='correct_datetime'
),
]
Run Code Online (Sandbox Code Playgroud)
鉴于数据库系统支持这一点,约束也将在数据库级别强制执行。