Модель django CharField: max_length не работает? - PullRequest
11 голосов
/ 12 декабря 2011

Я пытаюсь создать поле с ограниченным выбором:

Action_Types=(
              ('0','foo'),
              ('1','bar'),
              )

class Foo(models.Model):
    myAction=models.CharField(max_length=1,choices=Action_Types)

    def __unicode__(self):
        return '%d %s'%(self.pk,self.myAction)

Однако, когда я пытался вставить контент, нарушающий правила, он завершился успешно без каких-либо сообщений об ошибках или предупреждений (с помощью кнопки «управлять».ру раковины ").Кажется, любой текст любой длины может быть вставлен в это поле.Я использую SQLite3 в качестве бэкэнда.

Это должно быть так?Или если я что-то пропустил?

1 Ответ

19 голосов
/ 12 декабря 2011

SQLite не применяет длину VARCHAR.

Из SQLite Часто задаваемые вопросы :

(9) Каков максимальный размер VARCHAR в SQLite?

SQLite не применяет длину VARCHAR. Вы можете объявить VARCHAR (10), и SQLite с радостью предоставит вам 500 символов. И он сохранит все 500 символов без изменений - он никогда не усекается.

Если вы обновите базу данных с помощью форм администратора или модели django, Django выполнит проверку длины. В оболочке вы можете вручную вызвать full_clean перед сохранением и отловить ошибку проверки.

f = Foo(myAction="more than 1 char")
try:
    f.full_clean()
    f.save()
except ValidationError as e:
    # Do something based on the errors contained in e.message_dict.
...