2

当我尝试使用以下指令在 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)。

怎么了 ?

4

2 回答 2

6

那些表是由一个生成的manage.py inspectdb吧?那么你就不需要将django自己的模型包含到实际生成的模型中了。auth只需删除以、django和开头的任何admin模型site

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

于 2011-08-11T16:00:57.917 回答
3

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

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

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

对于不是 MyISAM 的表,MySQL 不会为搜索任何255CharField. 这也排除了TextField转换为 SQL的可能性TEXT

关于索引的 MySQL 文档相当全面。该CREATE INDEX文档让您了解问题的核心:

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

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

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

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

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

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

于 2011-08-11T15:47:22.557 回答