Py学习  »  Django

添加Django模型约束?

Q.Nguyen • 6 年前 • 1810 次点击  

我的模型周期如下:

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

如何添加约束 Period.start_time < Period.end_time 周期模型有这样的顺序吗?

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38795
文章 [ 2 ]  |  最新文章 6 年前
A. J. Parr
Reply   •   1 楼
A. J. Parr    7 年前

不用“开始”和“结束”,您可以使用 DurationField ,则从中计算“结束”属性。

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')) 
JPG
Reply   •   2 楼
JPG    7 年前

你可以用几种方法

方法-1: 覆盖 save() 方法 Period 模型组件

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)



方法-2: 覆盖 clean() 模型的方法

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 clean(self):
        super().clean()  # calling default cleaning
        if self.end_time < self.start_time:
            raise ValidationError("some message")


方法-3: 覆盖 full_clean() 方法

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")



参考
1。 Model.clean() - Django doc
2。 Model.save() - Django doc
三。 Model.full_clean() - Django doc