2015-11-12 75 views
0

我創建了以下型號:Django模型和驗證程序

類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 

之前,我添加了三個常量 '候選人', '審計' & '退休', 'STATUS_CHOICES'和另外三個字段; 'date_introduced','date_graduated'和'status'。一切工作正常。我有一個ModelForm,我可以用測試數據打開表單。當我在'reference_value'字段中輸入負值時,我根據我的驗證規則得到了適當的警告。

我添加上述,現在當我 'makemigrations',我得到:

ValueError異常:找不到在slide_library.models功能validate_positive。

對於我的生活,我不明白爲什麼它現在不會找到我的驗證器?

任何援助感激地收到。

+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'

+0

使用課堂以外的驗證器都能正常工作。 – Chas