Декоратор для переопределения сохранения для записи в нескольких базах данных - PullRequest
0 голосов
/ 12 июня 2018

Я планирую иметь модели в нашем приложении для записи в две базы данных.Я хотел написать декоратор, чтобы использовать его для всех моделей.Я использую приведенный ниже код

class save_multi_db(models.Model):
    def __call__(self, cls):
        class Wrapped(cls):
            def save(self, *args, **kwargs):
                redis_connection = redis.Redis(connection_pool=settings.MAPPING_REDIS_POOL)
                if int(redis_connection.get('write_to_db')):
                     super(cls, self).save(using='prod')
                     super(cls, self).save(using='default')
                else:
                     return cls.save()
        return Wrapped

У меня есть классы вроде ниже

@save_multi_db()
class ModelA(models.Model):
    #model A 

class MobelB(ModelA):
    class Meta:
        db_table = 'name'

Это прекрасно работает, если я использую декоратор для одной модели.Но в том же models.py, если я использую декоратор на другой модели.Я получаю сообщение об ошибке ниже

(fields.E300) Field defines a relation with model 'Wrapped', which is either not installed, or is abstract.

1 Ответ

0 голосов
/ 12 июня 2018

Если вы действительно хотите решить проблему путем переопределения Model.save(), не используйте декоратор класса, используйте абстрактный базовый класс и переопределите save() там:

class Multisave(models.Model):
    def save(self, *args, *kw):
        # your code here

    class Meta:
        abstract = True


class ModelA(Multisave):
   # ...

но, как упоминает Виллем Ван Онсем, это не будет работать должным образом для операций, обходящих Model.save(), поэтому использование маршрутизатора базы данных, безусловно, является гораздо более безопасным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...