Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 处理字段之间的关系_Django_Django Models - Fatal编程技术网

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'
)
]
定义(自我):
返回自我名称