У меня проблемы с загрузкой фикстур Django в мою базу данных MySQL из-за конфликтов типов содержимого. Сначала я попытался сбросить данные только из моего приложения следующим образом:
./manage.py dumpdata escola > fixture.json
но у меня постоянно возникали проблемы с отсутствием внешнего ключа, потому что мое приложение "escola" использует таблицы из других приложений. Я продолжал добавлять дополнительные приложения, пока не добрался до этого:
./manage.py dumpdata contenttypes auth escola > fixture.json
Теперь проблема заключается в следующем нарушении ограничения, когда я пытаюсь загрузить данные как тестовое приспособление:
IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")
Кажется, проблема в том, что Django пытается динамически воссоздать типы контента с разными значениями первичного ключа, которые конфликтуют со значениями первичного ключа из фикстуры. Это похоже на ошибку, описанную здесь: http://code.djangoproject.com/ticket/7052
Проблема в том, что рекомендуемый обходной путь - сбросить приложение contenttypes, которое я уже делаю !? Что дает? Если это имеет значение, у меня есть некоторые разрешения для пользовательской модели, как описано здесь: http://docs.djangoproject.com/en/dev/ref/models/options/#permissions
-e contenttypes -e auth.permission
с--natural
? Я просто попробовал без--natural
опции, и это сработало. Также в документации здесь говорится, что следует использовать эту опцию, если DUMPINGauth.permission
иcontenttypes
.ContentType
иPermission
не гарантируют получение того же идентификатора, что и раньше. Ваш дамп данных содержит идентификаторы, которые могут ссылаться на разные объекты в другой базе данных, куда вы загружаете данные. Это могло сработать для вас по одной из следующих причин: 1) ваши данные не имели ссылок на эти объекты 2) исходные идентификаторы Permission / ContentTypes были сохранены 3) ваши loaddata были успешными, но у вас действительно есть поврежденные данные из-за объектов относится к неправильным объектам, а вы еще об этом не знаете--natural
теперь устарел в пользу--natural-foreign
(и--natural-primary
)manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
--natural
теперь полностью удален, а не просто устарел. Используйте--natural-foreign
или--natural-primary
вместо.Да, это действительно раздражает. Некоторое время я работал над этим, выполняя «сброс manage.py» в приложении contenttypes перед загрузкой фикстуры (чтобы избавиться от автоматически сгенерированных данных contenttypes, которые отличались от дампированной версии). Это сработало, но в конце концов мне надоели хлопоты и полностью отказаться от приспособлений в пользу прямых SQL-дампов (конечно, тогда вы теряете переносимость БД).
update - лучший ответ - использовать
--natural
флагdumpdata
, как указано в ответе ниже. Когда я писал этот ответ, этого флага еще не было.источник
Попробуйте пропустить типы содержимого при создании фикстуры:
Это сработало для меня в аналогичной ситуации с модульными тестами, ваше понимание типов контента действительно помогло!
источник
Ответы здесь все старые ... По состоянию на 2017 год лучший ответ:
источник
Я не использовал MySQL, а вместо этого импортировал некоторые данные с живого сервера в sqlite. Очистка
contenttypes
данных приложения перед выполнениемloaddata
сработала:А потом
источник
Я решил эту проблему в своих тестовых примерах, сбросив приложение contenttypes из модульного теста перед загрузкой файла дампа. Карл предложил это уже с помощью
manage.py
команды, и я делаю то же самое, только используяcall_command
метод:Мой
full_test_data.json
прибор содержит дамп приложения contenttypes, который соответствует остальным тестовым данным. Сброс приложения перед загрузкой предотвращает дублирование ключаIntegrityError
.источник
У меня это работает. Здесь я исключаю все, что касается настоящих моделей.
источник
Вам нужно использовать естественные ключи для представления любого внешнего ключа и отношений «многие ко многим». Более того, было бы неплохо исключить
session
таблицу вsessions
приложении иlogentry
таблицу вadmin
приложении.Django 1.7+
Джанго <1,7
Согласно документации Django ,
--natural
он устарел в версии 1.7, поэтому--natural-foreign
следует использовать эту опцию .Вы также можете опустить первичный ключ в сериализованных данных этого объекта, поскольку он может быть вычислен во время десериализации путем передачи
--natural-primary
флага.источник
изменится
к
И приспособление работает прямо
TestCase
сейчасисточник
Django 2.2.5
это помогло мне
источник
Я дам еще один возможный ответ, который я только что понял. Может быть, это поможет ОП, может, кому-то еще.
У меня есть таблица отношений "многие ко многим". У него есть первичный ключ и два внешних ключа к другим таблицам. Я обнаружил, что если у меня есть запись в приспособлении, у которой два внешних ключа совпадают с другой записью, уже находящейся в таблице с другим pk, она завершится ошибкой. Таблицы отношений M2M имеют «уникальные вместе» для двух внешних ключей.
Итак, если это отношения M2M, которые нарушаются, посмотрите на добавляемые внешние ключи, посмотрите на свою базу данных, чтобы увидеть, не указана ли уже эта пара FK под другим PK.
источник
Это очень, очень раздражает ... Меня это каждый раз кусает.
Я пытался сбросить данные с помощью --exclude contenttypes и --natural, у меня всегда возникают проблемы ..
Для меня лучше всего просто выполнить a
truncate table django_content_type;
после syncdb и ЗАТЕМ загрузить данные.Конечно, для автозагрузки initial_data.json вы ошибаетесь.
источник
Иногда я сталкивался с подобной ошибкой назад. Оказалось, что я пытался загрузить светильники до создания необходимых таблиц. Так я и сделал:
И это сработало как шарм
источник
В моем случае я сбросил данные из
auth
(./manage.py dumpddata auth > fixtures/auth.json
), чтобы использовать приспособление для тестирования.Разработка продолжалась, и я удалил большинство моделей, в которых определил,
models.py
и именно тогда я начал видеть эту досадную проблему.Мое решение снова регенерировало приспособление auth.json. Здесь было удалено множество записей,
auth.permission
связанных со старыми моделями, которые у меня были.источник
Я перепробовал все способы, указанные выше, у меня ничего не сработало. Я должен исключить полную модель аутентификации и отлично работает.
источник