django model CharField:max_length不起作用?

时间:2011-12-12 17:10:44

标签: django sqlite model choice maxlength

我正在努力建立一个选择范围有限的领域:

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)

但是,当我尝试插入违反规则的内容时,它成功了,没有任何错误或警告消息(使用“manage.py shell”)。似乎任何长度的任何文本都可以放入这个领域。我正在使用SQLite3作为后端。

它应该是那样的吗?或者如果我错过了什么?

1 个答案:

答案 0 :(得分:19)

SQLite不强制使用VARCHAR的长度。

来自SQLite Frequently asked questions

  

(9)SQLite中VARCHAR的最大大小是多少?

     

SQLite不强制使用VARCHAR的长度。你可以声明一个VARCHAR(10),SQLite很乐意让你输入500个字符。并且它将保持所有500个字符完整 - 它永远不会截断。

如果使用django admin或model表单更新数据库,Django将为您进行长度验证。在shell中,您可以在保存之前手动调用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.