Як я можу конвертувати Django QuerySet у список диктів? Я не знайшов відповіді на це, тому мені цікаво, чи пропускаю я якусь загальну функцію помічника, якою користуються всі.
Як я можу конвертувати Django QuerySet у список диктів? Я не знайшов відповіді на це, тому мені цікаво, чи пропускаю я якусь загальну функцію помічника, якою користуються всі.
Відповіді:
Використовуйте .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), це мій швидкий "n" брудний спосіб зробити це:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Як ви бачите, побудова дактики в списку насправді НЕ СУХА, тому якщо хтось знає кращий спосіб ...
data = list( blogs )
і потім json.dumps( data )
. Масив виходить з купою об’єктів на стороні javascripta, не потрібний аналіз.
Ви точно не визначаєте, як мають виглядати словники, але, швидше за все, ви маєте на увазі QuerySet.values()
. З офіційної документації про джанго :
Повертає a
ValuesQuerySet
- aQuerySet
підклас, який повертає словники при використанні як ітерабельних об'єктів, а не об'єктів-моделей.Кожен із цих словників представляє об'єкт, з ключами, що відповідають назвам атрибутів модельних об'єктів.
Введіть Cast to List
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Ви можете використовувати values()
метод на дікті, який ви отримали з поля моделі 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()
повернути, передаючи їх у якості аргументів. Будьте також обережні, хоча, схоже, значення повертає список диктує насправді а,<class 'django.db.models.query.ValuesQuerySet'>
а не список.