2014-04-19 9 views
9

Chcę serializować wartości pojedynczego modelu w Django. Ponieważ chcę użyć get(), values() jest niedostępny. Jednak przeczytałem on Google Groups, że możesz uzyskać dostęp do wartości za pomocą __dict__.Jak JSON serializować __dict__ modelu Django?

from django.http import HttpResponse, Http404 
import json 
from customer.models import Customer 

def single(request, id): 
    try: 
     model = Customer.objects.get(id=id, user=1) 
    except Customer.DoesNotExist: 
     raise Http404 
    values = model.__dict__ 
    print(values) 
    string = json.dumps(values) 
    return HttpResponse(string, content_type='application/json') 

Wydanie to wypisuje instrukcja drukowania.

{'_state': <django.db.models.base.ModelState object at 0x0000000005556EF0>, 'web 
site': 'http://example.com/', 'name': 'Company Name', 'id': 1, 'logo': '', 'use 
r_id': 1, 'address3': 'City', 'notes': '', 'address2': 'Street 123', 'address1': 'Company Name', 'ustid': 'AB123456789', 'fullname': 'Full Name Of Company Inc.', 'mail': '[email protected]'} 

Ponieważ klucza _state która posiada wartość unserializable następna linia nie powiedzie się z tego błędu.

<django.db.models.base.ModelState object at 0x0000000005556EF0> is not JSON serializable 

Jak mogę serializacji słownika wrócił z __dict__ bez _state są włączone?

+0

możliwe duplikat [django WebAPI: zrzucić django model do JSON] (http://stackoverflow.com/questions/16155277/django-webapi-dump-django-model-to-json) – FallenAngel

+0

@FallenAngel serializowanie tego, co 'wszystko() Zwroty są trywialne, ale moje pytanie dotyczy 'get()'. Jest to powiązane, ale nie duplikat. – danijar

Odpowiedz

13

model_to_dict() jest to, czego potrzebujesz:

from django.forms.models import model_to_dict 

data = model_to_dict(model) 
data['logo'] = data['logo'].url 
return HttpResponse(json.dumps(data), content_type='application/json') 

Określając fields i exclude słów kluczowych argumentów można kontrolować, co pól do serializacji.

Ponadto, można uprościć blok try/except używając skrótu get_object_or_404():

model = get_object_or_404(Customer, id=id, user=1) 
+0

Dzięki! Dodałem potrzebny import do twojego pytania. Jednak nadal nie mogę serializować słownika, ponieważ zawiera on obraz Django. Myślę, że słownik musiałby zawierać adres URL obrazu zamiast całego obiektu Django. Dowolny pomysł? – danijar

+0

@danijar hm, jak się zachowuje w polu obrazu? Jakieś błędy? Czy możesz spróbować użyć wbudowanego serializera zapytań, jak zasugerowano [tutaj] (http://stackoverflow.com/a/1124531/771848)? Dzięki. – alecxe

+0

'model_to_dict()' zwraca słownik taki jak '{'name': 'Foo', 'user': 1, 'logo': }' który nie potrafi serializować. Serializatory Django zawijają słownik pól w innym, którego nie chcę. – danijar

0

I okazało się, że jest to rzeczywiście możliwe użycie values() wraz z get(). Trzeba tylko pobrać wartości z przefiltrowanego zestawu.

def single(request, id): 
    user = 1 
    try: 
     models = Customer.objects.filter(id=id, user=user) 
     values = models.values().get() 
    except Customer.DoesNotExist: 
     raise Http404 
    string = json.dumps(values) 
    return HttpResponse(string, content_type='application/json') 
1

sprawdzić kod źródłowy Django/rdzeń/serializers/__init__ .py komentarz:

Interfaces for serializing Django objects. 

Usage:: 

    from django.core import serializers 
    json = serializers.serialize("json", some_queryset) 
    objects = list(serializers.deserialize("json", json)) 

To add your own serializers, use the SERIALIZATION_MODULES setting:: 

    SERIALIZATION_MODULES = { 
     "csv" : "path.to.csv.serializer", 
     "txt" : "path.to.txt.serializer", 
    } 

dla jednego obiektu

json = serializers.serialize("json", some_queryset[0:1]) 
Powiązane problemy