Строгание QuerySet - PullRequest
       13

Строгание QuerySet

2 голосов
/ 06 мая 2019

Будет ли оценен набор запросов, т. Е. Django сделает попадания в базу данных, если я просто приведу в соответствие набор запросов?

Т.е. будет ли приведенный ниже оператор вызывать обращения к базе данных?

str(Model.objects.all())

Документация не содержит упоминаний о str()

Ответы [ 3 ]

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

Короткий ответ

Да, потому что в этом случае str использует __repr__.

Обоснование:

Согласно этот превосходный ответ SO на repr vs str в python:

, если __repr__ определено, а __str__ - нет, объект будет вести себя так, как если бы __str__=__repr__

Глядя на код django , мы видим, что __repr__ определено, а __str__ - нет, поэтому мы можем предположить, что документы на repr покрывают str также.

Попробуйте

Довольно легко проверить подобные вещи самостоятельно:

>>> from django.db import connection
>>> len(connection.queries)
0
>>> str(User.objects.all())
"<QuerySet [<User: test>, ...]>"
>>> len(connection.queries)
1

Прокомментируйте некоторые другие ответы

База данных не получает прямого доступа при вызове all(), что является прелестью ленивой оценки набора запросов.Запрос к БД не запускается до тех пор, пока не потребуются элементы ответа (как указано в документации, на которую указывает OP).

0 голосов
/ 06 мая 2019

Ваш код попадет в БД только один раз. Вызов Model.objects.all() будет включать преобразование SQL, которое отправляется в БД. После получения приложением вызов str() вызывает только метод __str__ внутри модели. Если он не определен, я думаю, что он вернет синтаксис по умолчанию, включающий первичный ключ (который я не могу вспомнить, так как всегда определяю __str__ для удобства чтения и тестирования).

0 голосов
/ 06 мая 2019

Для stringfy, я думаю, не будет никакого попадания в базу данных.только для Model.objects.all() он попадет в базу данных.Как только будет получен результат, он будет выполнять строковый набор запросов без попадания в базу данных.

str () - это просто функции преобразования типов в строки.

...