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