Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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
Python 添加Django模型约束?_Python_Django_Django Models - Fatal编程技术网

Python 添加Django模型约束?

Python 添加Django模型约束?,python,django,django-models,Python,Django,Django Models,我的模型期如下所示: class Period(models.Model): number = models.PositiveIntegerField(primary_key=True) start_time = models.TimeField() end_time = models.TimeField() 如何添加约束以使Period.start\u time

我的模型期如下所示:

class Period(models.Model):
      number = models.PositiveIntegerField(primary_key=True)
      start_time = models.TimeField()
      end_time = models.TimeField()
如何添加约束以使
Period.start\u time
和Period模型具有如下顺序

时段1:7:00-7:50;时段2:7:50-8:40

字段编号表示时段实例的顺序。我的方法是添加方法来检查它是否有效。但是,我想知道有任何数据库方法可以做到这一点。

您可以使用“开始”和“持续时间”来计算“结束”属性,而不是使用“开始”和“结束”

class Period(models.Model):
      number = models.PositiveIntegerField(primary_key=True)
      start_time = models.TimeField()
      duration = models.DurationField()

      @property
      def end_time(self):
          return self.start_time + self.duration
您还应该能够使用查询集上的
annotate
方法在查询中使用结束时间,即

query = Period.objects.all().annotate(end_time=F('start_time')+F('duration')) 

你可以用几种方法来做

方法-1:
保存()的
方法覆盖为
期间的
模型

from django.core.exceptions import ValidationError


class Period(models.Model):
    number = models.PositiveIntegerField(primary_key=True)
    start_time = models.TimeField()
    end_time = models.TimeField()

    def save(self, *args, **kwargs):
        if self.end_time < self.start_time:
            raise ValidationError("some message")
        super().save(*args, **kwargs)

方法-3:覆盖
完全清洁()

from django.core.exceptions import ValidationError


class Period(models.Model):
    number = models.PositiveIntegerField(primary_key=True)
    start_time = models.TimeField()
    end_time = models.TimeField()

    def full_clean(self, exclude=None, validate_unique=True):
        super().full_clean(exclude=None, validate_unique=True)  # calling default full_clean
        if self.end_time < self.start_time:
            raise ValidationError("some message")
来自django.core.exceptions的
导入验证错误
上课时间(models.Model):
数字=型号。正整数字段(主键=真)
开始时间=models.TimeField()
end_time=models.TimeField()
def full_clean(自我,排除=无,验证_unique=真):
super().full_clean(exclude=None,validate_unique=True)#调用默认的full_clean
如果self.end\u时间


参考 1.
2.

3.

最好是在任何东西保存到数据库之前,sou在Javascrpt中这样做。。。。或者您重写了models save方法,但必须在视图中捕获错误的数据条目。@ger.s.brett在JS中这样做是个坏主意。有些人可以在浏览器上禁用JS,然后提交错误的数据。但是,在
save
方法(或服务器端代码中的任何其他地方)中执行此操作是正确且安全的方法。
from django.core.exceptions import ValidationError


class Period(models.Model):
    number = models.PositiveIntegerField(primary_key=True)
    start_time = models.TimeField()
    end_time = models.TimeField()

    def full_clean(self, exclude=None, validate_unique=True):
        super().full_clean(exclude=None, validate_unique=True)  # calling default full_clean
        if self.end_time < self.start_time:
            raise ValidationError("some message")