首页 > 解决方案 > 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 ...)的另外两个重复查询。

有谁知道为什么会这样?

标签: pythondjango

解决方案


我无法重现,这与您的情况有关。我用通过的默认 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)

推荐阅读