【问题标题】:Django model validate date and datetime rangesDjango 模型验证日期和日期时间范围
【发布时间】:2016-04-26 19:19:04
【问题描述】:

在 Django 模型中验证日期和日期时间间隔的最佳解决方案是什么?

这是我的模型:

class PriceOption(Model):
    from_datetime = DateTimeField(verbose_name=_('from datetime'))
    to_datetime = DateTimeField(verbose_name=_('to datetime'))

    from_time = TimeField(verbose_name=_('from time'))
    to_time = TimeField(verbose_name=_('to time'))

我需要确保 from_datetime 发生在 to_datetime 之前,并且对于 from_time 和 to_time 也是如此。

我应该重写保存方法吗?还是验证器?

我看到 Postgres 有 Date 和 DateTime 范围字段。这只会解决第一对字段。

【问题讨论】:

  • 你使用表格吗?验证应该在表单上进行。
  • @ShangWang 是的,我想使用表单。在模型中进行这种验证不是更好吗?
  • 不,在表单上更方便。它还将逻辑与您的数据解耦。
  • Django 文档对您的情况进行了解释,以防您不知道:docs.djangoproject.com/en/1.9/ref/forms/validation/…

标签: django django-models django-forms


【解决方案1】:

最好使用表单来验证时间范围,表单已经内置函数clean()以满足您的需求:

class PriceOptionForm(forms.ModelForm):
    # some normal ModelForm setup goes here
    def clean(self):
        cleaned_data = super(PriceOptionForm, self).clean()
        from_time = cleaned_data.get("from_time")
        end_time = cleaned_data.get("end_time")

        if from_time and end_time:
            if end_time < from_time:
                raise forms.ValidationError("End time cannot be earlier than start time!")
        return cleaned_data

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 2013-10-06
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多