【发布时间】:2018-11-21 15:20:00
【问题描述】:
我计划在我们的应用程序中使用模型写入两个数据库。我想写一个装饰器来为所有模型使用它。我正在使用下面的代码
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.
【问题讨论】:
-
我认为在模型级别对此进行修补是相当奇怪的,因为通常模型对所使用的数据库是不变的。你可能会更好地实现数据库路由。
-
乍一看,在我看来,您构建的 mutliple 类都具有相同的名称,因此 Django 感到困惑。此外,这个
Wrapped可能会失败,以防它已经被包装一次。 -
我希望它必须在某个时候编写两个数据库
-
就像之前说的,模型层不是做数据库路由的好地方。
.save(..)并不总是被调用。例如ModelA.objects.update(foo=F('bar'))无论如何都会绕过.save(..)。所以你最好尝试实现一个数据库路由器。
标签: python django django-models decorator python-decorators