Django 处理字段之间的关系
这是我的模型:-Django 处理字段之间的关系,django,django-models,Django,Django Models,这是我的模型:- class Form(models.Model): name = models.CharField(max_length=100) description = models.TextField() created_on = models.DateTimeField(auto_now_add=True) starts_on = models.DateTimeField() ends_on = models.DateTimeField() def __str__(self):
class Form(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
starts_on = models.DateTimeField()
ends_on = models.DateTimeField()
def __str__(self):
return self.name
我想限制created_on始终小于等于start_on,类似地,end_on大于等于start_on。Django中有哪些选项可以执行此操作?您可以在中执行验证以执行验证。当您自己在视图中创建/更新对象时,这不会运行,但是
ModelForm
将调用它进行验证
自Django-2.2以来,您还可以添加一个CheckConstraint
,这些将在数据库级别强制执行。数据库不执行以下操作:
from django.core.exceptions import ValidationError
from django.db.models import F, Q
class Form(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
starts_on = models.DateTimeField()
ends_on = models.DateTimeField()
def clean(self):
if self.created_on > self.starts_on:
raise ValidationError('Starts on should be after create on')
if self.starts_on > self.ends_on:
raise ValidationError('Ends on should be after starts on')
return super().clean()
class Meta:
# since Django-2.2
constraints = [
models.CheckConstraint(
check=Q(created_on__lte=F('starts_on')),
name='create_lte_starts'
),
models.CheckConstraint(
check=Q(starts_on__lte=F('ends_on')),
name='starts_lte_ends'
)
]
def __str__(self):
return self.name
来自django.core.exceptions的导入验证错误
从django.db.models导入F,Q
课程形式(models.Model):
name=models.CharField(最大长度=100)
description=models.TextField()
已创建\u on=models.DateTimeField(自动\u now\u add=True)
启动\u on=models.DateTimeField()
ends_on=models.DateTimeField()
def清洁(自清洁):
如果self.created\u on>self.start\u on:
raise ValidationError('Starts on应该在create on'之后)
如果self.start\u on>self.ends\u on:
raise ValidationError('Ends on应该在starts on'之后)
返回super().clean()
类元:
#自Django-2.2以来
约束=[
模型。检查约束(
检查=Q(在lte=F(“启动”)上创建),
name='create\u lte\u start'
),
模型。检查约束(
检查=Q(在lte=F时开始('ends_on')),
name='starts\u lte\u ends'
)
]
定义(自我):
返回self.name
您可以在中执行验证以执行验证。当您自己在视图中创建/更新对象时,这不会运行,但是ModelForm
将调用它进行验证
自Django-2.2以来,您还可以添加一个CheckConstraint
,这些将在数据库级别强制执行。数据库不执行以下操作:
from django.core.exceptions import ValidationError
from django.db.models import F, Q
class Form(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
starts_on = models.DateTimeField()
ends_on = models.DateTimeField()
def clean(self):
if self.created_on > self.starts_on:
raise ValidationError('Starts on should be after create on')
if self.starts_on > self.ends_on:
raise ValidationError('Ends on should be after starts on')
return super().clean()
class Meta:
# since Django-2.2
constraints = [
models.CheckConstraint(
check=Q(created_on__lte=F('starts_on')),
name='create_lte_starts'
),
models.CheckConstraint(
check=Q(starts_on__lte=F('ends_on')),
name='starts_lte_ends'
)
]
def __str__(self):
return self.name
来自django.core.exceptions的导入验证错误
从django.db.models导入F,Q
课程形式(models.Model):
name=models.CharField(最大长度=100)
description=models.TextField()
已创建\u on=models.DateTimeField(自动\u now\u add=True)
启动\u on=models.DateTimeField()
ends_on=models.DateTimeField()
def清洁(自清洁):
如果self.created\u on>self.start\u on:
raise ValidationError('Starts on应该在create on'之后)
如果self.start\u on>self.ends\u on:
raise ValidationError('Ends on应该在starts on'之后)
返回super().clean()
类元:
#自Django-2.2以来
约束=[
模型。检查约束(
检查=Q(在lte=F(“启动”)上创建),
name='create\u lte\u start'
),
模型。检查约束(
检查=Q(在lte=F时开始('ends_on')),
name='starts\u lte\u ends'
)
]
定义(自我):
返回自我名称