可以在 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 模型验证器中使用多个值吗?的主要内容,如果未能解决你的问题,请参考以下文章