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.