首页 > 解决方案 > django:如何在函数中禁止数据库访问

问题描述

上下文:我们的项目有跨越 ForeignKey 关系的 DRF 序列化程序。因此,当我获得对象的 ListView 时,我会为每个对象获得额外的数据库命中,即 100 个项目的列表让我获得 100 个额外的数据库查询。不好。为了解决这个问题,我在我的视图中使用select_related/prefetch_related在序列化之前进行必要的连接。

问题:很难跟上select_related视图中的所有 s,尤其是当不同的开发人员使用相同的功能和序列化程序时。所以我想知道是否有办法禁止在函数中访问数据库(无论是视图还是序列化方法等)。第一个想法是将其包装在一个可计数的装饰器中,connection.queries但该计数器在生产中始终为空(何时DEBUG=False)。

那么有没有另一种方法来计算数据库DEBUG查询False

标签: djangodjango-rest-framework

解决方案


尝试通过限制数据库查询来装饰方法和类对我来说似乎是一种完全错误的方法。如果您想密切关注视图执行的数据库查询的数量,您应该使用单元测试。

Django 有一个测试断言来计算查询:

with self.assertNumQueries(2):
    response = self.client.get(my_url)

这将确保只有 2 个数据库查询来获取这个特定的视图。


推荐阅读