【问题标题】:Django Models and ValidatorsDjango 模型和验证器
【发布时间】:2015-11-12 19:21:04
【问题描述】:

我创建了以下模型:

类 SlideLibrary(models.Model):

CANDIDATE = 'Cand'
AUDIT = 'Audit'
RETIRED = 'Ret'

STATUS_CHOICES = (
    (CANDIDATE,'Candidate'),
    (AUDIT, 'Audit'),
    (RETIRED, 'Retired'),
)


def validate_positive(value):
    if value < 0:
        raise ValidationError(u'%s must be a positive number' % value)

slide_name = models.CharField(max_length=6, primary_key=True)
reference_value = models.FloatField(default='0', validators=[validate_positive])
date_introduced = models.DateField(null=True, blank=True)
date_graduated = models.DateField(null=True, blank=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES,default='Candidate', blank=True)
last_mean = models.FloatField(default= '0')
esd = models.FloatField(default= '0')
criteria = models.CharField(max_length= 10)

def save(self, *args, **kwargs):
    val = getattr(self, 'slide_name', False)
    if val:
        setattr(self, 'slide_name', val.upper())
    self.esd = self.calculate_esd()
    super(SlideLibrary,self).save(*args, **kwargs)

def calculate_esd(self):
    from math import sqrt
    if self.reference_value:
        try:
            return sqrt((self.reference_value-0.04) * self.reference_value**2)
        except ValueError:
            return 0
    else:
        return 0

def __unicode__(self):
    return self.slide_name

在我添加三个常量“CANDIDATE”、“AUDIT”和“RETIRED”、“STATUS_CHOICES”和三个附加字段之前; 'date_introduced'、'date_graduated' 和 'status'。一切正常。我有一个 ModelForm,我可以打开带有测试数据的表单。当我在“reference_value”字段中输入负值时,我会根据我的验证规则收到相应的警告。

我添加了上述内容,现在当我“makemigrations”时,我得到:

ValueError:在 slide_library.models 中找不到函数 validate_positive。

对于我的生活,我无法理解为什么它现在找不到我的验证器?

感谢您的任何帮助。

【问题讨论】:

  • 只是在相关说明中,在模型中放置过多的逻辑/验证并不是一个好的练习。如果您使用表单创建对象,只需将验证添加到表单即可。

标签: python django django-models


【解决方案1】:

你必须把你的函数 validate_positive 放到你的类 SlideLibrary 之外。

例如:

def validate_positive(value):
    if value < 0:
        raise ValidationError(u'%s must be a positive number' % value)

class SlideLibrary(models.Model):
    reference_value = models.FloatField(default=0, validators=[validate_positive])

你又犯了一个错误:你设置了一个 FloatField 然后使用default=0 而不是default='0'

【讨论】:

  • 验证器退出类后一切正常。
猜你喜欢
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2014-05-31
  • 2019-12-24
  • 2020-02-08
  • 1970-01-01
  • 2021-08-05
  • 2010-12-10
相关资源
最近更新 更多