Как мне преобразовать Django QuerySet в список диктов? - PullRequest
89 голосов
/ 18 октября 2011

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

Ответы [ 8 ]

122 голосов
/ 18 октября 2011

Используйте метод .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.

23 голосов
/ 08 сентября 2014

Метод .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
8 голосов
/ 25 марта 2017

Если вам по какой-то причине нужны собственные типы данных (например, сериализация JSON), это мой быстрый и грязный способ сделать это:

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]

Как вы можете видеть, построение диктата в списке на самом деле не СУХО, поэтому, если кто-то знает лучший способ ...

3 голосов
/ 18 октября 2011

Вы точно не определяете, как должны выглядеть словари, но, скорее всего, вы ссылаетесь на QuerySet.values(). Из официальной документации django :

Возвращает ValuesQuerySet - подкласс QuerySet, который возвращает словари при использовании в качестве повторяемого, а не экземпляра модели объекты.

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

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

Тип приведения в список

    job_reports = JobReport.objects.filter(job_id=job_id, status=1)..values('id', 'name')

    json.dumps(list(job_reports))
0 голосов
/ 19 февраля 2019

Вам нужно DjangoJSONEncoder и list, чтобы ваши Queryset до json, ref: Python JSON сериализуют десятичный объект

import json
from django.core.serializers.json import DjangoJSONEncoder


blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
0 голосов
/ 24 января 2019

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

0 голосов
/ 20 февраля 2016

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

Назовите это так -

myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...