Django - команда createsuperuser создает суперпользователя в базе данных по умолчанию при передаче параметра --database
В моем проекте есть три базы данных Postgre:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'default',
'USER': 'user',
'PASSWORD': 'password',
},
'clients_db': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'clients_db',
'USER': 'user',
'PASSWORD': 'password',
},
'other': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'other',
'USER': 'user',
'PASSWORD': 'password',
},
}
И три приложения: клиенты, пользователи и myapp.
У приложения clients есть маршрутизатор для базы данных clients_db:
class ClientsRouter:
route_app_labels = {'clients'}
def db_for_read(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'clients_db'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'clients_db'
return None
def allow_relation(self, obj1, obj2, **hints):
if (
obj1._meta.app_label in self.route_app_labels or
obj2._meta.app_label in self.route_app_labels
):
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label in self.route_app_labels:
return db == 'clients_db'
return None
Два других приложения используют одну и ту же базу данных. Я могу запускать миграции и мигрировать просто отлично, используя команды:
python manage.py makemigrations
Затем, чтобы применить миграции к базе данных default:
python manage.py migrate
И для применения миграций к другой базе данных:
python manage.py migrate --database other
Но когда я пытаюсь выполнить команду для создания суперпользователя в базе данных other, она создает суперпользователя в базе данных default вместо этого. Команда:
python manage.py createsuperuser --database other
Установленные приложения:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'clients',
'users',
'myapp',
'django_filters',
'widget_tweaks',
]
Насколько я понял из документации (https://docs.djangoproject.com/en/4.1/ref/django-admin/#createsuperuser), команда должна работать и создавать суперпользователя в указанной базе данных. Есть идеи, что я упускаю?
Прошло некоторое время, но поскольку других ответов не было, я выкладываю, как я обошел проблему, указанную в вопросе: Я использовал shell для копирования пользователя из базы данных default в базу данных other с помощью следующих команд:
python manage.py shell
from django.contrib.auth import get_user_model
Users = get_user_model()
u = Users.objects.get(pk=1)
u.save(using='other')
Вторая и третья строки нужны потому, что я использую пользовательскую модель пользователя. Если используется стандартная модель пользователя, то команды будут следующими:
python manage.py shell
from django.contrib.auth.models import User
u = Users.objects.get(pk=1)
u.save(using='other')
Последнее: у меня есть многопользовательское промежуточное ПО, которое использует потоки, и я думал, что это вызывает проблему, описанную в вопросе, но для меня странно, что даже при использовании shell это происходит. В любом случае, вот как я решил эту проблему.