添加 Django 模型约束?

我的模型周期如下:


class Period(models.Model):

      number = models.PositiveIntegerField(primary_key=True)

      start_time = models.TimeField()

      end_time = models.TimeField()

如何添加约束以使 makePeriod.start_time < Period.end_time和 Period 模型具有这样的顺序?


第一期:7:00-7:50;第二期:7:50-8:40;...


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


喵喔喔
浏览 133回答 2
2回答

慕姐8265434

你可以用几种方法来做到这一点方法-1:将模型save()方法覆盖Period为from django.core.exceptions import ValidationErrorclass Period(models.Model):&nbsp; &nbsp; number = models.PositiveIntegerField(primary_key=True)&nbsp; &nbsp; start_time = models.TimeField()&nbsp; &nbsp; end_time = models.TimeField()&nbsp; &nbsp; def save(self, *args, **kwargs):&nbsp; &nbsp; &nbsp; &nbsp; if self.end_time < self.start_time:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raise ValidationError("some message")&nbsp; &nbsp; &nbsp; &nbsp; super().save(*args, **kwargs)方法-2:覆盖clean()模型的方法from django.core.exceptions import ValidationErrorclass Period(models.Model):&nbsp; &nbsp; number = models.PositiveIntegerField(primary_key=True)&nbsp; &nbsp; start_time = models.TimeField()&nbsp; &nbsp; end_time = models.TimeField()&nbsp; &nbsp; def clean(self):&nbsp; &nbsp; &nbsp; &nbsp; super().clean()&nbsp; # calling default cleaning&nbsp; &nbsp; &nbsp; &nbsp; if self.end_time < self.start_time:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raise ValidationError("some message")方法 - 3:覆盖full_clean()方法from django.core.exceptions import ValidationErrorclass Period(models.Model):&nbsp; &nbsp; number = models.PositiveIntegerField(primary_key=True)&nbsp; &nbsp; start_time = models.TimeField()&nbsp; &nbsp; end_time = models.TimeField()&nbsp; &nbsp; def full_clean(self, exclude=None, validate_unique=True):&nbsp; &nbsp; &nbsp; &nbsp; super().full_clean(exclude=None, validate_unique=True)&nbsp; # calling default full_clean&nbsp; &nbsp; &nbsp; &nbsp; if self.end_time < self.start_time:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raise ValidationError("some message")

梵蒂冈之花

您可以使用DurationField拥有“开始”和“持续时间” ,而不是“开始”和“结束” ,然后从中计算“结束”属性。class Period(models.Model):&nbsp; &nbsp; &nbsp; number = models.PositiveIntegerField(primary_key=True)&nbsp; &nbsp; &nbsp; start_time = models.TimeField()&nbsp; &nbsp; &nbsp; duration = models.DurationField()&nbsp; &nbsp; &nbsp; @property&nbsp; &nbsp; &nbsp; def end_time(self):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return self.start_time + self.duration您还应该能够通过在查询集上添加annotate方法来使用查询中的结束时间,即query = Period.objects.all().annotate(end_time=F('start_time')+F('duration'))&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python