2011-06-29 18 views
3

在我的模型中,我有一个只包含值'A','B'和'C'的字段。在声明字段时,最好使用choice参数吗?验证Django中的值列表

如果我没有决定使用choice参数并且想为它编写自定义验证逻辑,那么我会在哪里写这个 - 这是否会在模型的clean方法中?我也见过clean_<fieldname>方法 - 这些方法是什么或只适用于表单?我想在模型中进行验证,因为我没有使用表单。

class Action(models.Model): 
    """ 
    Contains the logic for the visit 
    """ 
    id = models.AutoField(primary_key=True) 
    path = models.CharField(max_length=65535, null=False) 
    to = models.IntegerField(null=False) 

    def clean(self, **kwargs): 
     """ 
     Custom clean method to do some validation 
     """ 
     #Ensure that the 'to' is either 1,2 or 3. 
     if self.to not in [0, 1, 2]: 
      raise ValidationError("Invalid to value.") 

当我进行验证时,是否需要返回一些值?有人创建新记录时,我的方法方法会被调用吗?

(虽然我读过的文档,我还是有点困惑这个。)

由于一吨。

+4

我会推荐阅读这个博客:http://www.b-list.org/weblog/2007/nov/02/handle-choices-right-way/ – Nix

回答

1

在你给的例子,我会使用choice参数。如果您将“to”字段的验证置于clean方法中,则任何错误都将与操作实例关联,而不是“to”字段。

如您所述,clean_<fieldname>方法是为表单域。在模型上,您可以定义validators

下面是一个重写为验证器的干净方法的示例。

from django.core.exceptions import ValidationError 

def validate_to(value): 
    """ 
    Ensure that the 'to' is either 1, 2 or 3. 
    """ 
    if value not in [1, 2, 3]: 
     raise ValidationError("Invalid 'to' value.") 

class Action(models.Model): 
    """ 
    Contains the logic for the visit 
    """ 
    id = models.AutoField(primary_key=True) 
    path = models.CharField(max_length=65535, null=False) 
    to = models.IntegerField(null=False,validators=[validate_to]) 
2

如果你只希望它是'A','B'和'C',你应该使用Django的内置验证,而不是自己滚动。请参阅标题为choices的章节中的https://docs.djangoproject.com/en/1.3/ref/models/fields/

简单:

class Action(models.Model): 
    """ 
    Contains the logic for the visit 
    """ 

    TO_CHOICES = (
     (0, 'Choice 0'), 
     (1, 'Choice 1'), 
     (2, 'Choice 2'), 
    ) 
    id = models.AutoField(primary_key=True) 
    path = models.CharField(max_length=65535, null=False) 
    to = models.IntegerField(null=False, choices=TO_CHOICES)