19

我正在尝试创建一个选择有限的领域:

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 作为后端。

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

4

1 回答 1

35

SQLite 不强制 VARCHAR 的长度。

来自SQLite 常见问题

(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.
于 2011-12-12T17:13:41.610 回答