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ą.
122
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()
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ą.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 typuValuesQuerySet
, 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.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
iactual_result
muszą być tego samego typu (np. Słownik).źródło
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ć:
Jak widać, budowanie dyktu wewnątrz listy nie jest tak naprawdę SUCHE, więc jeśli ktoś zna lepszy sposób ...
źródło
data = list( blogs )
czymjson.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 :źródło
Wpisz Prześlij na listę
źródło
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 -
źródło
Co potrzeba
DjangoJSONEncoder
ilist
aby PaństwaQueryset
dojson
, Ref: Python JSON serializowania obiektu dziesiętnyźródło
Krótko mówiąc
list(yourQuerySet)
.źródło
Możesz zdefiniować funkcję za pomocą model_to_dict w następujący sposób:
źródło