【问题标题】:django doesn't check CharField length on objects.createdjango 不检查 objects.create 上的 CharField 长度
【发布时间】:2017-03-14 06:10:53
【问题描述】:

我正在使用 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>]>

我的问题是为什么 Person 等级属性可以创建“另一个”,因为我知道等级模型的最大长度为 2。谢谢您的解释

【问题讨论】:

  • 您确定在数据库中,表的列定义与您的模型是最新的吗?如果您在创建表格后使用 max_length 的值(或添加它),我想您可能会看到这样的行为。
  • @mimo 是否说您确定您已应用所有必需的迁移?还有你用的是什么类型的数据库?
  • @mimo 是的,我确定在创建人员对象实例之前我已经应用了所有迁移,并且在通过创建另一个模型回答您的问题之前检查了两次
  • @SardorbekImomaliev 我正在使用默认数据库 sqlite3
  • 这应该是不可能的,因为它在数据库级别上应用了约束github.com/django/django/blob/…

标签: python django sqlite django-models


【解决方案1】:

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

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

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

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

【讨论】:

  • @WiraBhakti 它不是“也许”它实际上是。我直接从官方文档中得到了这个报价。阅读我的答案中的链接
  • Sardorbek Imomaliev 抱歉,因为我来自不同的语言,在我的国家英语不是首选语言,所以我很少用英语交谈。来自印度尼西亚的问候
  • @WiraBhakti 明白了。来自俄罗斯的问候))此外,如果这确实回答了您的问题,您可以通过按下投票下的按钮来接受。 meta.stackexchange.com/questions/5234/…
【解决方案2】:

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

SQLite 不强制使用 max_length 属性。

至于输入一个无效的选择,它可能是 Django 1.10 的问题(这部分不要相信我的话)。

【讨论】:

  • 在 Django 1.10 中,尝试保存具有比 max_length 长的值的 CharField 的实例时出现错误:“对于类型字符变化 (2) 而言,值太长”。此外,如果该字段只能容纳 2 个字符,您的回答也没有解释为什么 Wira 可以打印“]>”。
猜你喜欢
  • 2014-06-14
  • 2017-04-13
  • 2018-12-08
  • 2017-05-10
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2011-11-06
相关资源
最近更新 更多