Как преобразовать Django QuerySet в список dicts? Я не нашел ответа на это, поэтому мне интересно, не хватает ли я какой-то общей вспомогательной функции, которую каждый использует.
Как преобразовать Django QuerySet в список dicts?
Ответ 1
Используйте метод .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
.
Ответ 2
Метод .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
Ответ 3
Если вам нужны родные типы данных по какой-либо причине (например, сериализация JSON), это мой быстрый "n" грязный способ сделать это:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Как вы видите, что построение dict внутри списка на самом деле не является СУХОЙ, поэтому, если кто-то знает лучший способ...
Ответ 4
Вы точно не определяете, как должны выглядеть словари, но, скорее всего, вы имеете в виду QuerySet.values()
. Из официальной документации django:
Возвращает подкласс
ValuesQuerySet
- aQuerySet
, который возвращает словари при использовании в качестве итеративного, а не экземпляра модели объекты.Каждый из этих словарей представляет собой объект с ключами соответствующие именам атрибутов объектов модели.
Ответ 5
Вы можете использовать метод values()
в файле dict, который вы получили из поля модели Django, на котором вы делаете запросы, и затем вы можете легко получить доступ к каждому полю по значению индекса.
Назовите его так:
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there a value in that index off course...
Ответ 6
Проще говоря list(yourQuerySet)
.