如何重写django中类或方法的内部读取查询

问题描述 投票:0回答:1

我不想覆盖我的类或方法中存在的内部读取查询。我不想编写通用解决方案,以便它可以在我不想修改读取查询的类或方法上工作。

我正在尝试使用装饰器、中间件和元类,但我无法访问函数的内部读取查询。

我只是不想修改它以从只读副本中获取它。但我不能对所有读取查询执行此操作。我只能修改读取查询以从少数类或方法的只读副本中获取它。

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')

请不要提供适用于某些特定应用程序的解决方案,例如使用路由将其移动到副本,因为它们将适用于整个项目或某些不特定于方法或类的应用程序。

python django django-rest-framework decorator metaclass
1个回答
0
投票

您可以使用 数据库路由器 [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']
© www.soinside.com 2019 - 2024. All rights reserved.