Проверка списка значений в Django - PullRequest
4 голосов
/ 29 июня 2011

В моей модели у меня есть поле, которое должно содержать только значения «A», «B» и «C».Будет ли это лучше всего использовать для использования параметра choice при объявлении поля?

Если бы я не решил использовать параметр 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.")

Когда я делаю проверку, нужно ли возвращать какое-то значение?Будет ли вызван метод моего метода, когда кто-то создаст новую запись?

(Хотя я прочитал документы, я все еще немного запутался в этом.)

Спасибо, тонна.1014 *

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Если вы хотите, чтобы это были только 'A', 'B' и 'C', вам определенно следует использовать встроенную валидацию Django вместо того, чтобы использовать собственную.См. https://docs.djangoproject.com/en/1.3/ref/models/fields/ в разделе под названием choices.

Вкратце:

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)
1 голос
/ 29 июня 2011

В приведенном вами примере я бы использовал параметр choice. Если вы поместите проверку для поля to в метод clean, любые ошибки будут связаны с экземпляром действия, а не с полем to.

Как вы сказали, clean_<fieldname> методы для полей формы. На модели вы можете определить валидаторы .

Вот пример вашего чистого метода, переписанного как валидатор.

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])
...