Django dump: модели не проверяют - PullRequest
2 голосов
/ 11 августа 2011

Когда я пытаюсь сбросить данные моей модели в 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).

Что не так?

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

Эти таблицы генерируются manage.py inspectdb верно?Тогда вам не нужно включать собственные модели django в реальные сгенерированные модели.Просто удалите любую модель, начиная с auth, django, admin и site.

. Просто включите соответствующие приложения contrib в настройку INSTALLED_APPS и вуаля, ошибок больше нет.

3 голосов
/ 11 августа 2011

Django пытается проверить вашу схему в соответствии с тем, что разрешит серверная часть базы данных, прежде чем она позволит вам выполнить дамп.Проблема заключается в следующем:

При использовании «unique = True» CharField не может иметь значение «max_length» больше 255.

Проблема, с которой вы столкнулись, заключается в следующем:CharField переводится в VARCHAR в SQL - если у вас есть max_length, который переводит в VARCHAR(X), где X - это то, что вы устанавливаете для максимальной длины.

MySQL для таблиц, которые не являютсяMyISAM, не будет индексировать (хеш) для поиска любых данных длиннее 255 символов в CharField.Это также исключает TextField, что переводится в SQL TEXT.

Документы MySQL по индексированию довольно полны .Документация CREATE INDEX позволяет понять суть проблемы: индексы

FULLTEXT поддерживаются только для таблиц MyISAM и могут содержать только столбцы 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.

...