【问题标题】:Django dump : models don't validateDjango 转储:模型不验证
【发布时间】:2011-10-25 02:42:28
【问题描述】:

当我尝试使用这条指令在 Django 中转储我的模型数据时:

python manage.py dumpdata app> temp_data.json

它给出了以下错误:

Error: One or more models did not validate:
asset.authpermission: "codename": CharField cannot have a "max_length" greater than 255 when using "unique=True".
asset.djangocontenttype: "app_label": CharField cannot have a "max_length" greater than 255 when using "unique=True".
asset.djangocontenttype: "model": CharField cannot have a "max_length" greater than 255 when using "unique=True".

问题是这些表是由 django 自动生成的。另外我刚刚检查了数据库(mysql),字段是varchar(100)。

怎么了?

【问题讨论】:

    标签: django django-models dump django-database


    【解决方案1】:

    那些表是由manage.py inspectdb 生成的,对吗?那么你就不需要将django自己的模型包含到实际生成的模型中了。只需删除以authdjangoadminsite 开头的任何模型。

    只需在 INSTALLED_APPS 设置中包含相应的贡献应用程序,瞧,没有更多错误。

    【讨论】:

      【解决方案2】:

      Django 正在尝试根据数据库后端允许的内容来验证您的架构,然后才允许您转储。问题是这样的:

      使用“unique=True”时,CharField 的“max_length”不能大于 255。

      您遇到的问题是:CharField 在 SQL 中转换为 VARCHAR - 如果您有 max_length 转换为 VARCHAR(X) 其中X是您设置的最大长度。

      对于不是 MyISAM 的表,MySQL 不会为在 CharField 中搜索长度超过 255 字符的任何数据编制索引(散列)。这也排除了 TextField 转换为 SQL TEXT

      关于索引are fairly comprehensive 的 MySQL 文档。 CREATE INDEX 文档让您了解问题的核心:

      仅 MyISAM 表支持 FULLTEXT 索引,并且只能包含 CHAR、VARCHAR 和 TEXT 列。索引总是发生在整个列上;不支持列前缀索引,如果指定,任何前缀长度都将被忽略。有关操作的详细信息,请参见第 11.9 节,“全文搜索功能”。

      换句话说,除非你使用 MyISAM 作为你的存储格式,否则你不能这样做。

      关于这是否是设计错误,无论哪种方式都有争论;一方面,您可能会争辩说,如果您需要将如此庞大的数据桶索引为一大堆文本,您确实需要更仔细地考虑这一点。另一方面,您可以争辩说 255 是限制的任意选择。为什么是 255 而不是 300?还是200?我会

      我自己刚刚遇到了这个问题。解决方案是询问unique=True 是否真的需要,然后决定max_length 是否真的需要那么长。在我的例子中,我们存储了 sha512 输出,它有 128 个字符长,所以我只是适当地调整了字段的大小。

      但是,如果您确实需要唯一的长数据,您可以自己通过覆盖模型save() 方法来强制执行此操作。您真正想要做的是覆盖full_clean 方法,该方法由django.forms.* 调用以根据模式验证模型的数据,然后调用覆盖的save 方法。这样,无论您是直接保存还是在表单上调用is_valid(),都会出现唯一性约束。

      另一个选择是切换到 MyISAM,或者使用 postgres。

      【讨论】:

      • 感谢您的回答,但问题是我没有创建有问题的表,django 自动创建了。我不会在任何地方手动使用它们。而且我注意到它没有验证模型,因为我将我的应用程序放在 installed_apps 中,在一切正常执行之前..
      • @Johanna 在您将应用程序添加到 installed_apps 之前,django 不会尝试验证它可能拥有的任何模型 - installed_apps 告诉它在哪里寻找这样做。安装这个新应用后,您是否运行过 syncdb?我不希望它能够工作,因为后端应该抱怨 - 即使您还没有使用该代码区域,这也会抱怨,因为 django 将使用数据库后端验证所有模型模式(它实际使用的 sql)(s )。
      • 感谢您的解释,我很了解 Django。我很困惑,因为当我运行服务器时它说“验证模型......”。但现在很好,saverio 的回答很好
      猜你喜欢
      • 2017-08-16
      • 1970-01-01
      • 2019-12-24
      • 2012-11-03
      • 2018-11-30
      • 2021-08-05
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多