社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

添加Django模型约束?

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

我的模型周期如下:

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