我计划在我们的应用程序中使用模型写入两个数据库。我想写一个装饰器,用于所有模型。我使用以下代码
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.
答案 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):
# ...
的操作,这将无法正常工作,因此使用数据库路由器肯定是一种更安全的解决方案。