Django - раздельные БД для записи и чтения и проблема с тестами

Я создал отдельные базы данных для операций чтения и для операций записи. В моей среде DEV это указывает на одну и ту же базу данных, но под разными псевдонимами. В среде PROD это переписывается и указывает на 2 отдельные базы данных, которые связаны между собой и содержат в основном одни и те же данные.

Тем не менее, хотя конфигурация работает корректно при использовании моего веб-приложения Django (запуск веб-сервера, игра с логикой через браузер), мои модульные тесты, которые создают/изменяют и затем утверждают изменения в экземплярах моделей, не могут быть запущены вообще. Ошибка, которую я получаю при запуске моих модульных тестов, выглядит следующим образом: ValueError: Cannot force both insert and updating in model saving.

Моя установка выглядит следующим образом:

settings.py

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "django",
        "USER": "dj",
        "PASSWORD": "mypassword",
        "HOST": "127.0.0.1",
        "PORT": "3306",
    },
    "read_db": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "django",
        "USER": "dj",
        "PASSWORD": "mypassword",
        "HOST": "127.0.0.1",
        "PORT": "3306",
    },
    "write_db": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "django",
        "USER": "dj",
        "PASSWORD": "mypassword",
        "HOST": "127.0.0.1",
        # localhost because otherwise client is trying to connect via socket instead of TCP IP
        "PORT": "3306",
    },
    "root": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "root",
        "USER": "xxx",
        "PASSWORD": "zzz",
        "HOST": "127.0.0.1",
        "PORT": "3306",
    },
}

DATABASE_ROUTERS = ["config.db_routers.ReadWriteDatabaseRouter"]

db_routers.py

class ReadWriteDatabaseRouter(object):
    """
    A database router to control all operations on the read and write databases.
    """

    read_db = "read_db"
    write_db = "write_db"

    def db_for_read(self, model, **hints):
        """Defines the database to be used for read operations."""
        return self.read_db

    def db_for_write(self, model, **hints):
        """Defines the database to be used for write operations."""
        return self.write_db

    def allow_relation(self, obj1, obj2, **hints):
        """Relations between objects are allowed if both objects are in the primary/replica pool."""
        db_set = {self.read_db, self.write_db}
        if obj1._state.db in db_set and obj2._state.db in db_set:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """All models end up in this pool."""
        return True

Моя цель - использовать отдельную базу данных для операций записи и отдельную базу данных для операций чтения. Для юнит-тестов или тестирования в целом, мне не важно, создаст ли Django отдельную базу данных SQLite3 или другую базу данных в MySQL, просто она должна работать корректно.

Есть идеи, как я могу решить эту проблему, пожалуйста?

Спасибо

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