Проблемы с contenttypes при загрузке прибора в Django
У меня возникли проблемы с загрузкой 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
Ответы
Ответ 1
manage.py dumpdata --natural
будет использовать более длительное представление внешних ключей. В джанго они называются "естественными ключами". Например:
-
Permission.codename
используется в пользу Permission.id
-
User.username
используется в пользу User.id
Подробнее: раздел естественных ключей в "сериализации объектов django"
Некоторые другие полезные аргументы для dumpdata
:
-
--indent=4
сделать его понятным для человека.
-
-e sessions
исключить данные сеанса
-
-e admin
исключить историю действий администратора на сайте администратора.
-
-e contenttypes -e auth.Permission
исключать объекты, которые автоматически воссоздаются из схемы каждый раз во время syncdb
. Используйте его только вместе с --natural
, иначе вы можете столкнуться с плохо выровненными номерами идентификаторов.
Ответ 2
Да, это действительно раздражает. Некоторое время я работал над ним, выполняя "manage.py reset" в приложении contenttypes перед загрузкой прибора (чтобы избавиться от автоматически генерируемых данных контента, которые отличались от сбрасываемой версии). Это сработало, но в итоге я устал от неприятностей и оставленных светильников полностью в пользу прямых SQL-дампов (конечно, тогда вы теряете переносимость DB).
update - лучший ответ - использовать флаг --natural
для dumpdata
, как указано в ответе ниже. Этот флаг еще не существовал, когда я написал этот ответ.
Ответ 3
Попробуйте пропустить типы контента при создании привязки:
./manage.py dumpdata --exclude contenttypes > fixture.json
Это работало для меня в аналогичной ситуации для модульных тестов, вам очень помогло понимание про контент-типов!
Ответ 4
Ответы здесь все старые... По состоянию на 2017 год лучший ответ:
manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4
Ответ 5
Я не использовал MySQL, но вместо этого импортировал некоторые данные с живого сервера в sqlite. Очистка данных приложения contenttypes
перед выполнением loaddata
сделала трюк:
from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()
quit()
И затем
python manage.py loaddata data.json
Ответ 6
Я разрешил эту проблему в своих тестовых случаях, сбросив приложение contenttypes из unit test до загрузки файла дампа. Карл предложил это уже с помощью команды manage.py
, и я делаю то же самое только с помощью метода call_command
:
>>> from django.core import management
>>> management.call_command("flush", verbosity=0, interactive=False)
>>> management.call_command("reset", "contenttypes", verbosity=0, interactive=False)
>>> management.call_command("loaddata", "full_test_data.json", verbosity=0)
My full_test_data.json
fixture содержит дамп приложения контента, который соответствует остальным тестовым данным. Сбрасывая приложение перед загрузкой, он предотвращает дублирование ключа IntegrityError
.
Ответ 7
python manage.py dumpdata --natural-primary --exclude=contenttypes --exclude=auth.Permission --exclude=admin.logentry --exclude=sessions.session --indent 4 > initial_data.json
Это работает для меня. Здесь я исключаю все пузырьки реальных моделей.
- Если вы видите какую-либо другую модель, отличную от созданных вами моделей, вы можете смело исключить их. Одним из недостатков этого подхода является то, что вы теряете данные журнала, а также данные auth.
Ответ 8
Вы должны использовать естественные ключи для представления любых внешних ключей и отношений "многие ко многим". Кроме того, может быть хорошей идеей исключить таблицу session
в приложении sessions
и таблицу logentry
в приложение admin
.
Django 1. 7+
python manage.py dumpdata --natural-foreign --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json
Django <1.7
python manage.py dumpdata --natural --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json
Согласно документации Django, --natural
устарел в версии 1.7, поэтому вместо этого следует использовать опцию --natural-foreign
.
Вы также можете опустить первичный ключ в сериализованных данных этого объекта, поскольку он может быть вычислен во время десериализации, передав флаг --natural-primary
.
python manage.py dumpdata --natural-foreign --natural-primary --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json
Ответ 9
./manage.py dumpdata app.Model --natural-foreign
изменится
"content_type": 123
в
"content_type": [
"app_label",
"model"
],
И крепление работает для TestCase
сейчас
Ответ 10
Я собираюсь дать еще один возможный ответ, который я только что понял. Может быть, это поможет OP, может быть, это поможет кому-то еще.
У меня есть таблица отношений "многие ко многим". Он имеет первичный ключ и два внешних ключа к другим таблицам. Я обнаружил, что если у меня есть запись в приборе, у которых два внешних ключа совпадают с другой записью, уже находящейся в таблице с другим pk, это не сработает. Таблицы отношений M2M имеют "уникальную комбинацию" для двух внешних ключей.
Итак, если это нарушение отношения M2M, посмотрите на внешние ключи, которые он добавляет, посмотрите на свою базу данных, чтобы увидеть, что эта пара FK уже указана в разных PK.
Ответ 11
Это действительно, очень раздражает.. Я укусаюсь этим каждый раз.
Я попытался создать dumpdata с --exclude contenttypes и --естественно, я всегда получаю проблемы.
Что лучше всего подходит для меня, просто выполняйте truncate table django_content_type;
после syncdb и THEN загружайте данные.
Конечно, для автозагрузки initial_data.json вы являетесь fallball.
Ответ 12
Я иногда сталкивался с подобной ошибкой. Оказалось, что я пытался загрузить приборы, прежде чем создавать необходимые таблицы. Итак, я сделал:
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py loaddata fixtures/initial_data.json
И он работал как шарм
Ответ 13
Джанго 2.2.5
python manage.py dumpdata --exclude=contenttypes > datadump.json
это помогло мне