2 回答

TA贡献1813条经验 获得超2个赞
你可以用几种方法来做到这一点
方法-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")

TA贡献1900条经验 获得超5个赞
您可以使用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'))
添加回答
举报