在子类化db.models.Model的同时,有时必须添加额外的判断/约束.

我有一台Event型的,start_date号和end_date号的.

我想将验证添加到字段或模型中,以便end_date > start_date.

有多少种可能的方法可以做到这一点?

至少我知道这可以在ModelForm验证内的models.Model之外完成.

但是如何连接到字段和models.Model

推荐答案

我不会在save方法中放置这样的约束,太晚了.在那里引发异常对以错误方式输入数据的用户没有帮助,因为它将以500结束,并且用户将不会得到包含错误的表单,依此类推.

您真的应该在Forms/ModelForms清理方法中判断这一点,并引发ValidationError,因此form.is_valid()返回False,您可以将表单中的错误发送回用户进行更正.

还要注意的是,从1.2版开始,Django已经有了Model Validation个版本.

它看起来像这样:

class Foo(models.Model):
    #  ... model stuff...
    def clean(self):
        if self.start_date > self.end_date:
            raise ValidationError('Start date is after end date')

Django相关问答推荐

Django:无法分配必须是实例(&Q;X),不想获取对象(&Q;)

Django中的Sync_to_Async修饰器、异步视图

如何从列中捕获数据并将其添加到下拉菜单中,以便表单填充另一个表

将所有守护用户对象权限从一个Django用户重新分配给另一个Django用户

Django没有';t显示黄页

如何使更新记录在 Django 模型中传递信号?

更改Django的创建时间字段

使用OuterRef过滤器获取Django记录的最大值

Django 注释(),计数()

如何在 django 中修改现有模型实例?

如何根据反向外键相关模型的字段过滤 QuerySet?

如何在 Django 中将下一个 8 月 1 日添加为 DateTimeField 默认值

ModelForm 的 Django TextField max_length 验证

is_valid() vs clean() Django 表单

django excel xlwt

如何在 Django Rest Framework SimpleRouter 上使斜杠可选

django 模板 if 或语句

单击弹出框会滚动回页面顶部 [Bootstrap 和 Django]

无效的块标签: static

在 Django 中测试different layers的最佳实践是什么?