Миграция в различные схемы баз данных в Python Django 5
У меня проблема с миграцией в базе данных PostgreSQL с 2 схемами: public и users. У меня есть модели пользователей и их профилей. Требуется поместить их в схему с именем «users», а затем создать суперпользователя и несколько основных пользователей. Но каждый раз, когда я делаю миграции, Django создает таблицы в схеме по умолчанию «public» или у меня возникают различные ошибки. Многочисленные попытки исправить это не привели к результату, поэтому мне нужна помощь.
Мои модели:
class MyUser(AbstractUser):
class Meta:
managed = True
db_table = 'users\".\"user' # gives a problem
email = models.EmailField(_("email address"), unique=True)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username"]
objects = MyUserManager()
class MyProfile(models.Model):
class Meta:
managed = True
db_table = 'users\".\"profile' # gives a problem
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=200, default="Name")
surname = models.CharField(max_length=200, default="Surname")
Мой менеджер:
class MyUserManager(BaseUserManager):
def create_user(self, email, password, **extra_fields):
if not email:
raise ValueError(_("Email required"))
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault("is_staff", True)
extra_fields.setdefault("is_superuser", True)
extra_fields.setdefault("is_active", True)
if extra_fields.get("is_staff") is not True:
raise ValueError(_("is_staff=True required"))
if extra_fields.get("is_superuser") is not True:
raise ValueError(_("is_superuser=True required"))
return self.create_user(email, password, **extra_fields)
Моя БД:
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': "djangotest",
'USER': "postgres",
'PASSWORD': "********",
'HOST': "localhost",
'PORT': "5432",
'OPTIONS': {
'options': '-c search_path=public,users'
}
Возможно, что-то нужно добавить в маршрутизатор:
ROUTED_MODELS_SCHEMA = [MyUser]
class DataBaseRouter(object):
def db_for_read(self, model, **hints):
if model in ROUTED_MODELS_SCHEMA:
return 'users'
return None
def db_for_write(self, model, **hints):
if model in ROUTED_MODELS_SCHEMA:
return 'users'
return None
Если я набираю python manage.py migrate
, у меня есть таблицы только в схеме «public». Если я ввожу python manage.py migrate
с --database
, у меня есть таблицы в схеме «users», но сервер жалуется на отсутствие миграции, которая должна быть уже выполнена, и я не могу создать суперпользователя.
Если я использую db_table = 'users\".\"user'
, у меня возникает синтаксическая ошибка и я не могу создать ни одной таблицы.
Я пытался найти ответ на разных сайтах и изменил различные файлы проекта, такие как dbrouter.py e.t.c., но эта проблема все еще существует. Пожалуйста, дайте мне несколько шагов, что я должен сделать. Или ссылку на действительно работающий проект на GitHub, чтобы проанализировать его. Спасибо.