装饰器覆盖保存以写入多个数据库

时间:2018-06-12 09:20:52

标签: python django django-models decorator python-decorators

我计划在我们的应用程序中使用模型写入两个数据库。我想写一个装饰器,用于所有模型。我使用以下代码

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 :(得分:0)

如果真的希望通过覆盖Array.newInstance来解决问题,请不要使用类装饰器,而是使用抽象基类并覆盖Model.save()

save()

但正如Willem Van Onsem所提到的,对于绕过class Multisave(models.Model): def save(self, *args, *kw): # your code here class Meta: abstract = True class ModelA(Multisave): # ... 的操作,这将无法正常工作,因此使用数据库路由器肯定是一种更安全的解决方案。