Django `assertNumQueries`, показывающий повторяющиеся запросы в отложенном поле - PullRequest
2 голосов
/ 06 мая 2020

У меня странное поведение, я не могу понять, почему это происходит. У меня есть простой набор запросов с отложенным полем, например 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().

1 Ответ

1 голос
/ 06 мая 2020

Не могу воспроизвести, это что-то связано с вашим случаем. Я написал этот тестовый пример с пользователем по умолчанию 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...