Как перенести пользовательскую модель User в другое приложение в Django?
В Django я пытаюсь перенести пользовательскую модель User из одного приложения в другое. Когда я следую инструкциям, например, найденным здесь, и пытаюсь применить миграцию, я получаю ошибки ValueError: Related model 'newapp.user' cannot be resolved
, которые происходят из django.contrib.admin.models.LogEntry.user
, который определяется как models.ForeignKey(settings.AUTH_USER_MODEL, ...)
, то есть это модель из Django admin (которую я также использую), которая имеет внешний ключ к модели User. Как я могу сделать эту миграцию?
Для swappable models (моделей, которые могут быть заменены через значение в settings
) такой ход нетривиален. Корень проблемы здесь в том, что LogEntry
имеет внешний ключ к settings.AUTH_USER_MODEL
, но история самого settings.AUTH_USER_MODEL
не управляется и не известна миграциям Django. Когда вы изменяете AUTH_USER_MODEL
, чтобы он указывал на новую модель User, это ретроактивно изменяет историю миграций, как ее видит Django. Для Django теперь выглядит так, как будто внешний ключ LogEntry всегда ссылался на новую модель User. Когда вы запускаете миграцию, которая создает таблицу для LogEntry (например, при повторной инициализации базы данных или при запуске тестов), Django не может разрешить модель и терпит неудачу.
См. также этот выпуск .
<<<Чтобы обойти эту проблему, необходимо указать на модель, которая существует в начальной миграции для нового приложения. Есть несколько подходов к тому, чтобы заставить это работать. Я предположу, что модель AUTH_USER_MODEL
перемещена из User
в sourceapp
destapp
Отказ от ответственности: конкретная пользовательская модель, которую мне нужно было перенести, не содержала никаких полей типа "многие-ко-многим" (или любых других ссылок на таблицы, если на то пошло), поэтому то, что я тестировал, предназначено только для такой пользовательской модели без других ссылок на таблицы. Я не думаю, что это должно иметь значение для любого из вариантов выше, но я мог что-то упустить