Как я могу преобразовать Django QuerySet в список dicts? Я не нашел ответа на этот вопрос, поэтому мне интересно, не хватает ли мне какой-то общей вспомогательной функции, которую все используют.
Как я могу преобразовать Django QuerySet в список dicts? Я не нашел ответа на этот вопрос, поэтому мне интересно, не хватает ли мне какой-то общей вспомогательной функции, которую все используют.
Ответы:
Используйте .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
.
values()
, я не знаю, есть ли хороший метод, чтобы сделать то же самое, values()
но и с вызовом методов экземпляра ?!
.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
list(result)
Если вам по какой-то причине нужны собственные типы данных (например, сериализация JSON), это мой быстрый и грязный способ сделать это:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Как видите, создание словаря внутри списка на самом деле не СУХОЕ, поэтому, если кто-то знает способ получше ...
data = list( blogs )
а потом json.dumps( data )
. Выходит массив с кучей объектов на стороне javascript, синтаксический анализ не требуется.
Вы не совсем точно определяете, как должны выглядеть словари, но, скорее всего, вы имеете в виду QuerySet.values()
. Из официальной документации django :
Возвращает
ValuesQuerySet
-QuerySet
подкласс, который возвращает словари при использовании в качестве итерации, а не объекты экземпляра модели.Каждый из этих словарей представляет объект с ключами, соответствующими именам атрибутов объектов модели.
Тип приведен в список
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Вы можете использовать values()
метод в dict, который вы получили из поля модели Django, по которому вы делаете запросы, а затем вы можете легко получить доступ к каждому полю по значению индекса.
Назовите это так -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
Вам нужно DjangoJSONEncoder
и list
сделать свой Queryset
к json
, ссылка: Python JSON сериализации объект Decimal
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
values()
вернуть, передав их в качестве аргументов. Также будьте осторожны, хотя похоже, что values возвращает список dicts, на самом деле это a,<class 'django.db.models.query.ValuesQuerySet'>
а не список.