Istnieje wiele dokumentacji na temat serializacji modelu QuerySet, ale jak po prostu serializować do JSON pola wystąpienia modelu?
python
django
json
django-models
serialization
Jason Christa
źródło
źródło
django.core
. Czy jest jakiś szczególny powód, aby nie używać serializacji zestawu zapytań?Odpowiedzi:
Możesz łatwo użyć listy do zawijania wymaganego obiektu i to wszystko, czego serializatory django potrzebują, aby go poprawnie serializować, np .:
źródło
[0]
na końcu swojej ostatniej linii, jak zasugerował @DavorLucic? I nie ma potrzeby umieszczania przecinka na końcu listy dosłownie (z miłości do PEP8;).Jeśli masz do czynienia z listą instancji modelu, najlepsze, co możesz zrobić, to użyć
serializers.serialize()
, będzie idealnie pasować do twoich potrzeb.Jednak napotkasz problem z próbą serializacji pojedynczego obiektu, a nie
list
obiektów. W ten sposób, aby pozbyć się różnych hacków, po prostu użyj Djangomodel_to_dict
(jeśli się nie mylę, teżserializers.serialize()
na tym polega):Teraz potrzebujesz tylko jednego bezpośredniego
json.dumps
wywołania, aby serializować go do json:Otóż to! :)
źródło
datetime
polami. Rozwiązałem to w ten sposób,json.loads(serialize('json', [obj]))[0]
podczas gdy serializator jestdjango.core.serializers.serialize
Aby uniknąć otoki tablicy, usuń ją przed zwróceniem odpowiedzi:
Znalazłem też interesujący wpis na ten temat:
http://timsaylor.com/convert-django-model-instances-to-dictionaries
Używa django.forms.models.model_to_dict, które wygląda na idealne narzędzie do pracy.
źródło
Jest na to dobra odpowiedź i jestem zaskoczony, że nie została o tym wspomniana. Za pomocą kilku wierszy możesz obsłużyć daty, modele i wszystko inne.
Utwórz niestandardowy koder, który obsługuje modele:
Teraz użyj go, gdy używasz json.dumps
Teraz modele, daty i wszystko to można serializować i nie musi to być w tablicy ani serializowane i nieserializowane. Wszystko, co masz niestandardowe, można po prostu dodać do
default
metody.Możesz nawet użyć natywnej JsonResponse Django w ten sposób:
źródło
json.dumps
ijson.dump
. W ten sposób nie musisz zmieniać przepływu pracy aplikacji, ponieważ używasz niestandardowych obiektów lub dodajesz inne wywołanie metody przed konwersją na json. Po prostu dodaj swój kod konwersji w koderze i gotowe.Wygląda na to, że pytasz o serializowanie struktury danych instancji modelu Django w celu zapewnienia współdziałania. Inne plakaty są poprawne: jeśli chcesz, aby serializowany formularz był używany z aplikacją Pythona, która może wysyłać zapytania do bazy danych za pośrednictwem interfejsu API Django, chciałbyś serializować zestaw zapytań za pomocą jednego obiektu. Jeśli z drugiej strony potrzebujesz sposobu na ponowne napełnienie instancji modelu w innym miejscu bez dotykania bazy danych lub bez użycia Django, to masz trochę pracy do wykonania.
Oto co robię:
Najpierw używam
demjson
do konwersji. Tak się złożyło, że znalazłem to, co znalazłem jako pierwsze, ale może nie być najlepsze. Moja implementacja zależy od jednej z jego funkcji, ale powinny być podobne sposoby z innymi konwerterami.Po drugie, zaimplementuj
json_equivalent
metodę we wszystkich modelach, które mogą być potrzebne do serializacji. Jest to magiczna metodademjson
, ale prawdopodobnie będzie to coś, o czym będziesz chciał pomyśleć bez względu na wybraną implementację. Chodzi o to, że zwracasz obiekt, który jest bezpośrednio konwertowany najson
(tj. Tablicę lub słownik). Jeśli naprawdę chcesz to zrobić automatycznie:Nie będzie to pomocne, chyba że masz całkowicie płaską strukturę danych (nie
ForeignKeys
, tylko liczby i ciągi znaków w bazie danych itp.). W przeciwnym razie powinieneś poważnie pomyśleć o właściwym sposobie wdrożenia tej metody.Po trzecie, zadzwoń
demjson.JSON.encode(instance)
i masz to, czego chcesz.źródło
Jeśli pytasz, jak serializować pojedynczy obiekt z modelu i wiesz , że dostaniesz tylko jeden obiekt w zestawie zapytań (na przykład za pomocą objects.get), użyj czegoś takiego:
co dałoby ci coś w formie:
źródło
Rozwiązałem ten problem, dodając metodę serializacji do mojego modelu:
Oto rozwlekły odpowiednik dla tych, którzy mają awersję do jednowierszowych:
_meta.fields
to uporządkowana lista pól modelu, do których można uzyskać dostęp z instancji oraz z samego modelu.źródło
Oto moje rozwiązanie, które pozwala łatwo dostosować JSON, a także organizować powiązane rekordy
Najpierw zaimplementuj metodę na modelu. Dzwonię,
json
ale możesz to nazwać, jak chcesz, np:Następnie w widoku robię:
źródło
car.json()
Użyj listy, to rozwiąże problem
Krok 1:
Krok 2:
Krok 3:
źródło
Aby serializować i deserialze, użyj następującego:
źródło
.values()
jest tym, czego potrzebowałem, aby przekonwertować instancję modelu na JSON.Dokumentacja .values (): https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values
Przykładowe użycie z modelem o nazwie Project .
Uwaga: używam Django Rest Framework
Wynik z prawidłowego identyfikatora:
źródło
Jeśli chcesz zwrócić pojedynczy obiekt modelu jako odpowiedź json do klienta, możesz zrobić to proste rozwiązanie:
źródło
Użyj Django Serializer z
python
formatem,Jaka jest różnica między
json
ipython
formatem ?json
Format zwróci wynik jakostr
natomiastpython
zwróci wynik w jednejlist
lubOrderedDict
źródło
OrderedDict
, niedict
Wydaje się, że nie można serializować instancji, musiałbyś serializować QuerySet jednego obiektu.
Skończyło mi się
svn
wydanie django, więc może nie być we wcześniejszych wersjach.źródło
Zwracam dyktando mojej instancji
więc zwraca coś takiego jak {'pole1': wartość, "pole2": wartość, ....}
źródło
TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
co powiesz na ten sposób:
lub wyklucz wszystko, czego nie chcesz.
źródło
Wszystkie te odpowiedzi były trochę zepsute w porównaniu z tym, czego oczekiwałbym od frameworka, myślę, że najprostsza metoda, jeśli używasz reszty:
Używa to Serializatora bezpośrednio, z poszanowaniem pól, które zdefiniowałeś w nim, a także wszelkich skojarzeń itp.
źródło