Как я могу преобразовать 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'>а не список.