2011-12-12 62 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()才能檢查正確性。 –