Подтвердить что ты не робот

Как преобразовать Django QuerySet в список dicts?

Как преобразовать Django QuerySet в список dicts? Я не нашел ответа на это, поэтому мне интересно, не хватает ли я какой-то общей вспомогательной функции, которую каждый использует.

4b9b3361

Ответ 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 - a QuerySet, который возвращает словари при использовании в качестве итеративного, а не экземпляра модели объекты.

Каждый из этих словарей представляет собой объект с ключами соответствующие именам атрибутов объектов модели.

Ответ 5

Вы можете использовать метод values() в файле dict, который вы получили из поля модели Django, на котором вы делаете запросы, и затем вы можете легко получить доступ к каждому полю по значению индекса.

Назовите его так:

myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there a value in that index off course...

Ответ 6

Проще говоря list(yourQuerySet).