Skip to main content
 首页 » 编程设计

python之添加 Django 模型约束

2024年09月07日37xxx_UU

我的模型 Period 如下:

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

我如何添加约束来制作Period.start_time < Period.end_time和 Period 模型有这样的顺序吗?

Period 1: 7:00-7:50; Period 2: 7:50-8:40; ...

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

请您参考如下方法:

你可以通过多种方式做到这一点

方法-1:重写Period模型的save()方法为

<b>from django.core.exceptions import ValidationError</b> 
 
 
class Period(models.Model): 
    number = models.PositiveIntegerField(primary_key=True) 
    start_time = models.TimeField() 
    end_time = models.TimeField() 
 
    <b>def save(self, *args, **kwargs): 
        if self.end_time < self.start_time: 
            raise ValidationError("some message") 
        super().save(*args, **kwargs)</b>



方法-2:重写模型的clean()方法

<b>from django.core.exceptions import ValidationError</b> 
 
 
class Period(models.Model): 
    number = models.PositiveIntegerField(primary_key=True) 
    start_time = models.TimeField() 
    end_time = models.TimeField() 
 
    <b>def clean(self): 
        super().clean()  # calling default cleaning 
        if self.end_time < self.start_time: 
            raise ValidationError("some message")</b>


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

<b>from django.core.exceptions import ValidationError</b> 
 
 
class Period(models.Model): 
    number = models.PositiveIntegerField(primary_key=True) 
    start_time = models.TimeField() 
    end_time = models.TimeField() 
 
    <b>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")</b>



引用
1. Model.clean() - Django doc
2. Model.save() - Django doc
3. Model.full_clean() - Django doc