Django`assertNumQueries`显示延迟字段上的重复查询

2024-10-03 23:31:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一种奇怪的行为,我不知道为什么会这样。 我有一个带有延迟字段的简单queryset,例如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语句(selectphonefrom…)的另外两个重复查询

有人知道为什么会这样吗

  • 注意:我使用的是Django 2.0。它也使用only()发生,它是defer()的对应物

Tags: self证明idobjectswithphone语句filter
1条回答
网友
1楼 · 发布于 2024-10-03 23:31:06

我无法复制,这和你的案子有关。我用通过的默认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)

相关问题 更多 >