Как настроить корневой файл медиа для многопользовательского приложения в django

Я создаю многопользовательское приложение на django. Я выбрал "Isolated database with a shared app server" с этого сайта - https://books.agiliq.com/projects/django-multi-tenant/en/latest/isolated-database.html. Я использую django-storages с AWS S3 bucket. Проблема Я не смог понять, как настроить файл MediaRoot для разных баз данных в файле настроек django. Есть ли какая-нибудь опция в файле настроек, чтобы использовать mediaroot с условием if. Например, если я использую db_1, то используйте этот mediaroot_1, если использую db_2, то используйте mediaroot_2. Это необходимо для того, чтобы взимать плату с клиента в соответствии с использованием aws bucket.

settings.py

DATABASE_ROUTERS = ["core.router.TenantRouter"]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'db_1': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db_1.sqlite3',
    },
    'db_2': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db_2.sqlite3',
    },
}


#### the below I need if statement for different database
#### I want to use bucket_1 for db_1 and so on
AWS_STORAGE_BUCKET_NAME = os.environ.get("AWS_STORAGE_BUCKET_NAME")

AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'

Я пытался перенести get_current_db_name() из middleware.py в settings.py, но у меня не получилось. Я пробовал django-tenant-schemas и другие подобные пакеты, но я хотел бы обойтись без сторонних пакетов.

######## middleware.py

import threading

from .utils import tenant_db_from_request

THREAD_LOCAL = threading.local()


class TenantMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        db = tenant_db_from_request(request)
        setattr(THREAD_LOCAL, "DB", db)
        response = self.get_response(request)
        return response


def get_current_db_name():
    return getattr(THREAD_LOCAL, "DB", None)


def set_db_for_router(db):
    setattr(THREAD_LOCAL, "DB", db)

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