Jak mogę przekonwertować zestaw Django QuerySet na listę dykt? Nie znalazłem odpowiedzi na to pytanie, więc zastanawiam się, czy brakuje mi jakiejś typowej funkcji pomocniczej, z której wszyscy korzystają.
Jak mogę przekonwertować zestaw Django QuerySet na listę dykt? Nie znalazłem odpowiedzi na to pytanie, więc zastanawiam się, czy brakuje mi jakiejś typowej funkcji pomocniczej, z której wszyscy korzystają.
Odpowiedzi:
Użyj .values()
metody:
>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
Uwaga: wynik jest taki, QuerySet
który zachowuje się głównie jak lista, ale w rzeczywistości nie jest wystąpieniem list
. Użyj, list(Blog.objects.values(…))
jeśli naprawdę potrzebujesz wystąpienia list
.
values()
, nie wiem, czy istnieje dobra metoda, aby zrobić to samo, values()
ale także z wywołaniem metod instancji ?!
.values()
Metoda zwróci państwu wynik typu ValuesQuerySet
, który jest zwykle to, co trzeba w większości przypadków.
Ale jeśli chcesz, możesz przekształcić ValuesQuerySet
się w natywną listę Pythona, używając funkcji rozumienia list w języku Python, jak zilustrowano w poniższym przykładzie.
result = Blog.objects.values() # return ValuesQuerySet object
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list
return list_result
Uważam, że powyższe pomaga, jeśli piszesz testy jednostkowe i musisz stwierdzić, że oczekiwana wartość zwracana przez funkcję jest zgodna z rzeczywistą wartością zwracaną, w którym to przypadku oba expected_result
i actual_result
muszą być tego samego typu (np. Słownik).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
Jeśli z jakiegoś powodu potrzebujesz natywnych typów danych (np. Serializacji JSON), to jest mój szybki i brudny sposób, aby to zrobić:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Jak widać, budowanie dyktu wewnątrz listy nie jest tak naprawdę SUCHE, więc jeśli ktoś zna lepszy sposób ...
data = list( blogs )
czym json.dumps( data )
. Wychodzi tablica z wieloma obiektami po stronie javascript, bez konieczności analizowania.
Nie określasz dokładnie, jak powinny wyglądać słowniki, ale najprawdopodobniej odnosisz się do nich QuerySet.values()
. Z oficjalnej dokumentacji django :
Zwraca
ValuesQuerySet
-QuerySet
podklasę, która zwraca słowniki, gdy jest używana jako iterowalna, a nie obiekty instancji modelu.Każdy z tych słowników reprezentuje obiekt, a klucze odpowiadają nazwom atrybutów obiektów modelu.
Wpisz Prześlij na listę
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Możesz użyć values()
metody na dykt, który otrzymałeś z pola modelu Django, na którym tworzysz zapytania, a następnie możesz łatwo uzyskać dostęp do każdego pola za pomocą wartości indeksu.
Nazwij to tak -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
Co potrzeba DjangoJSONEncoder
i list
aby Państwa Queryset
do json
, Ref: Python JSON serializowania obiektu dziesiętny
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
values()
zwrócić, przekazując je jako argumenty. Bądź też ostrożny, chociaż wygląda na to, że wartości zwracają listę dykt, które są w rzeczywistości a,<class 'django.db.models.query.ValuesQuerySet'>
a nie listą.