Django模型和验证器

时间:2015-11-12 19:21:04

标签: python django django-models

我创建了以下模型:

类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

在我添加三个常数'候选','审核'和&amp; 'RETIRED','STATUS_CHOICES'和另外三个领域; 'date_introduced','date_graduated'和'status'。一切都很好。我有一个ModelForm,我可以用测试数据打开表单。当我在'reference_value'字段中输入负值时,我根据验证规则得到了相应的警告。

我添加了上面的内容,现在当我'makemigrations'时,我得到了:

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

对于我的生活,我不明白为什么它现在找不到我的验证器?

感激不尽的任何帮助。

1 个答案:

答案 0 :(得分: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'