Проблема с различными отношениями схем в Django Migrations
У меня есть база данных с несколькими схемами и отношениями между ними, и у меня есть проблема с миграцией базы данных в Django.
Сначала я создал BaseModel, чтобы переопределить параметры мета-класса:
base_models.py:
import django.db.models.options as options
from django.db import models
options.DEFAULT_NAMES = options.DEFAULT_NAMES + ("database",)
class BaseErpModel(models.Model):
class Meta:
abstract = True
database = "erp"
models.py
from django.db import models
from config.base_models import BaseErpModel
from teste_migrate.users.models import User
class TrendUpload(BaseErpModel):
trend_name = models.CharField("Tendência", max_length=255)
created_at = models.DateTimeField("Data de criação", auto_now_add=True)
user = models.ForeignKey(User, verbose_name="Usuário", on_delete=models.DO_NOTHING)
class Meta(BaseErpModel.Meta):
database = "erp"
def __str__(self):
return f"{self.trend_name} - {self.created_at}"
dbrouter.py
from django.apps import apps
class BaseRouter(object):
"""A router to control all database operations on models in
the erp schema"""
def db_for_read(self, model, **hints):
"Point all operations on model to 'database' meta db"
if hasattr(model._meta, "database"):
return model._meta.database
return "default"
def db_for_write(self, model, **hints):
"Point all operations on model to 'database' meta db"
if hasattr(model._meta, "database"):
return model._meta.database
return "default"
def allow_relation(self, obj1, obj2, **hints):
"Allow any relation in the same Database"
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Don't allow migrate to 'not_alowed_relation_models'
"""
try:
model = apps.get_model(app_label, model_name)
except:
return None
try:
database = model._meta.database
allow_migration = model._meta.allow_migration
except:
database = "default"
allow_migration = True
return database == db and allow_migration
При миграции python manage.py migrate --database=erp
у меня возникает ошибка отношения:
django.db.utils.ProgrammingError: relation "users_user" does not exist
что имеет смысл, потому что сгенерированный SQL не имеет никакого упоминания о схеме erp:
ALTER TABLE "catalog_trendupload" ADD CONSTRAINT "catalog_trendupload_user_id_64a6cf8e_fk_users_user_id" FOREIGN KEY ("user_id") REFERENCES "users_user" ("id") DEFERRABLE INITIALLY DEFERRED;
Я могу обойти эту ошибку, отредактировав SQL файл и заменив "users_user" на "django.users_user", но это нецелесообразно, потому что у меня много других таблиц с подобными отношениями. Также я не могу изменить базу данных, поместив все таблицы в одну схему.
Я пытался переопределить класс django.db.backends.base.schema.BaseDatabaseSchemaEditor
, но у меня нет доступа к пользовательскому параметру database из моей модели. Когда я печатаю класс модели, к которому обращается класс BaseDatabaseSchemaEditor, я вижу <class '__fake__.TrendUpload'>
. Если я могу получить доступ к параметру database, я могу переопределить BaseDatabaseSchemaEditor.sql_create_fk
параметр.
Кто-нибудь знает, как получить доступ к этому пользовательскому параметру при миграции или, возможно, имеет другой подход?