Проблема с различными отношениями схем в 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параметр.

Кто-нибудь знает, как получить доступ к этому пользовательскому параметру при миграции или, возможно, имеет другой подход?

Вернуться на верх