可以在 django 模型验证器中使用多个值吗?

Posted

技术标签:

【中文标题】可以在 django 模型验证器中使用多个值吗?【英文标题】:Can multiple values be used in django a model validator? 【发布时间】:2012-09-20 06:44:26 【问题描述】:

我的模型验证器使用了一个名为CompareDates 的验证类,我想向验证器传递两个字段值。但是我不确定如何在验证器中使用多个字段值。

我希望能够在日期之间进行比较,以便从整体上验证模型,但您似乎无法对传递给验证器的值添加关键字,还是我遗漏了什么?

from django.db import models
from myapp.models.validators.validatedates import CompareDates

class GetDates(models.Model):
    """
    Model stores two dates
    """
    date1 = models.DateField(
            validators = [CompareDates().validate])
    date2 = models.DateField(
            validators = [CompareDates().validate])

【问题讨论】:

【参考方案1】:

“普通”验证器只会获取当前字段值。所以它不会做你想做的事。但是,您可以添加一个干净的方法,并且 - 如果需要的话 - 像这样覆盖您的保存方法:

class GetDates(models.Model):
    date1 = models.DateField(validators = [CompareDates().validate])
    date2 = models.DateField(validators = [CompareDates().validate])
    def clean(self,*args,**kwargs):
        CompareDates().validate(self.date1,self.date2)
    def save(self,*args,**kwargs):
        # If you are working with modelforms, full_clean (and from there clean) will be called automatically. If you are not doing so and want to ensure validation before saving, uncomment the next line.
        #self.full_clean()
        super(GetDates,self).save(*args,**kwargs)

【讨论】:

按照文档, clean 不会被自动调用,但需要在某个地方手动调用,例如保存方法。这对 500 错误并没有真正的帮助;但我已经修改了代码。 对于它的价值,这不适用于 Django Rest 框架(我很想被证明是错误的)。在模型的 clean() 中引发 django.core.exceptions.ValidationError 将引发 500 内部服务器错误。我见过的最好的解决方法是将 django ValidationError 更改为 rest_framework ValidationError 并重新抛出它。更多信息:github.com/encode/django-rest-framework/issues/2145

以上是关于可以在 django 模型验证器中使用多个值吗?的主要内容,如果未能解决你的问题,请参考以下文章

不使用 django 表单如何验证和保存表单数据

Django 错误:一个或多个模型未验证:

django:如何从包含外键的多个模型中制作一个表单

CommandError:一个或多个模型未验证

可以在单个 TextInput 中保存多个值吗?

Django REST 验证器。多个用户可以拥有相同值的记录,但该记录对于每个用户都是唯一的,如何做到这一点?