python - Django `assertNumQueries` 显示延迟字段上的重复查询
问题描述
我有一个奇怪的行为,我无法找出它发生的原因。例如,我有一个带有延迟字段的简单查询集Person.objects.filter(id=4).defer('phone')
,然后我有一个断言这一点的测试:
with self.assertNumQueries(2):
p = Person.objects.filter(id=4).defer('phone').first() # 1 query
p.phone # 1 query
它失败了,因为它似乎在该块上运行了三个查询:过滤时的第一个查询,以及来自p.phone
语句(SELECT phone FROM ...)的另外两个重复查询。
有谁知道为什么会这样?
- 注意:我使用的是 Django 2.0。它也发生使用
only()
, 的对应物defer()
。
解决方案
我无法重现,这与您的情况有关。我用通过的默认 Django 用户编写了这个测试用例。如果您需要更好的答案,请提供更多信息。
class TestDefer(APITestCase):
def test_defer(self):
u = User.objects.create(email='aaa@bbb.com', is_staff=True)
with self.assertNumQueries(1):
p = User.objects.defer('is_staff').get(id=u.id)
with self.assertNumQueries(1):
print(p.is_staff)
with self.assertNumQueries(1):
p = User.objects.defer('email').get(id=u.id)
with self.assertNumQueries(1):
print(p.email)
推荐阅读
- swagger - 灵活的规则取决于招摇的类型
- kotlin - Micronaut 内省生成的类
- bash - linux中依赖于语言的“是”命令,可能吗?
- python - 如何更改字符串的每个子字符串中的字符?
- pytorch - 如何使用 Pytorch 在神经网络中实现门控?
- cypress - 为 Cypress 测试禁用 Chrome 网络安全
- arrays - SwiftUI - 如何修改数组中的文本字段
- php - 将 css/js 文件导入 laravel 8 时出现 404 错误
- slack - Slack API:单击按钮时如何在消息中添加用户头像?
- amazon-web-services - 无法执行 rails 迁移命令