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'))
添加回答
舉報