亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

添加 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 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號