gpt4 book ai didi

Django - 防止自动获取相关表

转载 作者:行者123 更新时间:2023-12-01 05:41:50 25 4
gpt4 key购买 nike

出于测试目的,如何防止 Django 在初始查询期间自动获取 select_related() 调用中未指定的相关表?

我有一个很大的应用程序,我在其中大量使用
select_related() 在每个原始过程中引入相关的模型数据
询问。所有 select_related() 调用都用于指定特定的相关模型,而不是依赖于默认值,例如select_related('foo', 'bar', 'foo__bar')

随着应用程序的增长, select_related 调用还没有
完全跟上,留下了一些Django开心的场景
并亲切地跑到数据库去获取相关的模型
行。这显着增加了数据库命中的数量,从而
我显然不想。

通过检查查询,我在跟踪这些方面取得了一些成功
使用 django.db.connection.queries 集合生成,但有些
悬而未决。

我试图在 django 代码中找到一个合适的补丁位置来引发
这种情况下的异常(exception),使跟踪更容易,但往往
迷失在代码中。

谢谢。

最佳答案

经过更多的挖掘,我在代码中找到了执行此操作的位置。

有问题的文件是 django/db/models/fields/related.py

您需要在此文件中插入两行。

找到类“SingleRelatedObjectDescriptor”。您需要更改函数 __get__() 如下:

def __get__(self, instance, instance_type=None):
if instance is None:
return self
try:
return getattr(instance, self.cache_name)
except AttributeError:
raise Exception("Automated Database Fetch on %s.%s" % (instance._meta.object_name, self.related.get_accessor_name()))
# leave the old code here for when you revert!

同样,在代码更下方的“ReverseSingleRelatedObjectDescriptor”类中,您再次需要将 __get__() 更改为:
def __get__(self, instance, instance_type=None):
if instance is None:
return self

cache_name = self.field.get_cache_name()
try:
return getattr(instance, cache_name)
except AttributeError:
raise Exception("Automated Database Fetch on %s.%s" % (instance._meta.object_name, self.field.name))
# BEWARE: % parameters are different to previous class
# leave old code here for when you revert

完成此操作后,您会发现 Django 每次执行自动数据库查找时都会引发异常。当您第一次开始时,这很烦人,但它会帮助您跟踪那些讨厌的数据库查找。显然,当您找到所有这些时,最好将数据库代码恢复到正常状态。我只建议在调试/性能调查阶段使用它,而不是在实时生产代码中使用!

关于Django - 防止自动获取相关表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5043095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com