2011-12-12 64 views
8

我想利用有限的选择字段:django模型CharField:max_length不起作用?

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壳” )。看起来任何长度的文本都可以放入这个字段。我使用SQLite3作为后端。

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

回答

16

SQLite不强制执行VARCHAR的长度。

SQLite Frequently asked questions

(9)什么是SQLite中一个VARCHAR的最大尺寸是多少?

SQLite不强制执行VARCHAR的长度。你可以声明一个VARCHAR(10),SQLite会很乐意让你放500个字符。它将保持所有500个字符的完整 - 它从不截断。

如果您使用django管理或模型表单更新数据库,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. 
+1

感谢您的回答,Alasdair!似乎只有通过使用full_clean()才能检查正确性。 –