Как конвертировать объект QuerySet в Django в список предсказывает?
Как я могу преобразовать Django QuerySet в список диктовок? Я не нашел ответа на этот вопрос, поэтому мне интересно, отсутствует ли у меня какая-то общая вспомогательная функция, которую все используют.
5 ответов:
использовать
.values()
способ:>>> Blog.objects.values() [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}], >>> Blog.objects.values('id', 'name') [{'id': 1, 'name': 'Beatles Blog'}]
Примечание: результат -
QuerySet
, который в основном ведет себя как список, но на самом деле не экземплярlist
. Используйтеlist(Blog.objects.values(…))
если вам действительно нужен экземплярlist
.
The
.values()
метод возвращает результат типаValuesQuerySet
обычно то, что вам нужно в большинстве случаев.но если вы хотите, вы могли бы превратить
ValuesQuerySet
в собственный список Python с использованием понимания списка Python, как показано в примере ниже.result = Blog.objects.values() # return ValuesQuerySet object list_result = [entry for entry in result] # converts ValuesQuerySet into Python list return list_result
Я считаю, что вышеизложенное помогает, если вы пишете модульные тесты и должны утверждать, что ожидаемое возвращаемое значение функции соответствует фактическому возвращаемому значению, и в этом случае оба
expected_result
иactual_result
должны быть одного типа (например, словарь).actual_result = some_function() expected_result = { # dictionary content here ... } assert expected_result == actual_result
вы точно не определяете, как должны выглядеть словари, но, скорее всего, вы имеете в виду
QuerySet.values()
. Из официальная документация django:возвращает a
ValuesQuerySet
- aQuerySet
подкласс, который возвращает словари при использовании в качестве итерируемого, а не экземпляра модели объекты.каждый из этих словарей представляет объект, с ключами соответствует именам атрибутов модели объекты.
Если вам по какой-то причине нужны собственные типы данных (например, сериализация JSON), это мой быстрый "грязный" способ сделать это:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Как вы можете видеть, построение диктатора внутри списка не очень сухо, поэтому, если кто-то знает лучший способ ...