为了账号安全,请及时绑定邮箱和手机立即绑定

添加 Django 模型约束?

添加 Django 模型约束?

喵喔喔 2021-06-03 18:01:41
我的模型周期如下: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;...字段编号表示期间实例的顺序。我的方法是添加方法来检查它是否有效。但是,我想知道有什么数据库方法可以做到这一点。
查看完整描述

2 回答

?
慕姐8265434

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


查看完整回答
反对 回复 2021-06-15
?
梵蒂冈之花

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


查看完整回答
反对 回复 2021-06-15
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号