django没有检查objects.create上的CharField长度

时间:2016-11-01 05:00:52

标签: python django sqlite django-models

我正在使用django 1.10并尝试制作一些包含一些简单选择的模型,这是我的models.py

@python_2_unicode_compatible
class Person(models.Model):
    Senior='A'
    Middle='B'
    Junior='C'
    class_person=[(Senior,'Senior'),(Middle,'Middle'),\
             (Junior,'Junior')]

    name=models.CharField(max_length=100)
    grade=models.CharField(max_length=2,choices=class_person,default=Junior)

    def __str__(self):
        return '%s in %s' % (self.name,self.grade)

    def is_senior(self):
        return self.grade in (self.Senior,self.Middle)

现在我尝试通过shell创建一些Person对象实例,例如

Person.objects.create(name='John',grade='Another')

现在我打电话

Person.objects.all()

然后返回

<QuerySet [<Person: John in Another>]>

我的问题为什么人员等级属性可以创建另一个&#39;据我所知,等级模型的最大长度为2.感谢您的解释

2 个答案:

答案 0 :(得分:2)

这就是sqlite3的工作原理。 Id不强制执行长度限制

https://sqlite.org/faq.html#q9

  

SQLite不强制使用VARCHAR的长度。你可以声明一个VARCHAR(10),SQLite很乐意在那里存储一个5亿字符串。它将保持所有5亿个字符完好无损。您的内容永远不会被截断。无论N的值如何,SQLite都将“VARCHAR(N)”的列类型理解为与“TEXT”相同。

如果你想要更多功能完整的数据库使用postgres或mysql

答案 1 :(得分:-1)

废弃我以前的答案 - 根据 django model CharField: max_length does not work?

SQLite不强制执行max_length属性。

至于输入无效的选择,它可能是Django 1.10的问题(不要理解这部分)。