我不想覆盖我的类或方法中存在的内部读取查询。我不想编写通用解决方案,以便它可以在我不想修改读取查询的类或方法上工作。
我正在尝试使用装饰器、中间件和元类,但我无法访问函数的内部读取查询。
我只是不想修改它以从只读副本中获取它。但我不能对所有读取查询执行此操作。我只能修改读取查询以从少数类或方法的只读副本中获取它。
master_models.CarTransmission.objects.filter( # pylint: disable=E1101 variant_id__in=self.variant_ids ).values_list(*self.specifications, named=True)
将其修改为-
master_models.CarTransmission.objects.using('replica').filter( # pylint: disable=E1101 variant_id__in=self.variant_ids ).values_list(*self.specifications, named=True)
原创-
model = get_object_or_404(master_models.Model,slug=slug)
将其修改为 -
model = get_object_or_404(master_models.Model.objects.using('replica'),slug=slug)
我期望的逻辑应该特定于类和方法。如果我在类上应用该方法,则所有存在的方法都应该修改所有内部读取查询。是否可能,或者我应该去所有查询并写入 .using('replica')
请不要提供适用于某些特定应用程序的解决方案,例如使用路由将其移动到副本,因为它们将适用于整个项目或某些不特定于方法或类的应用程序。
您可以使用 数据库路由器 [Django-doc] 为此:
# app_name/router.py
class ReplicateRouter:
def db_for_read(self, model, **hints):
return 'replicate'
对于从数据库读取的查询,它将使用
replicate
数据库。
并在设置中安装路由器:
# settings.py
DATABASE_ROUTERS = ['app_name.router.ReplicateRouter']