Як я можу конвертувати 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'>а не список.