2014-04-19 14 views
9

Ich möchte die Werte eines einzelnen Modells in Django serialisieren. Weil ich get() verwenden möchte, ist values() nicht verfügbar. Ich lese jedoch on Google Groups, dass Sie auf die Werte mit __dict__ zugreifen können.Wie JSON __dict__ eines Django-Modells serialisiert?

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') 

Die print-Anweisung gibt dies aus.

{'_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]'} 

Wegen der _state Schlüssel, der die nächste Zeile nicht mit diesem Fehler einen unserialisierbar Wert hält.

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

Wie kann ich das Wörterbuch Serialisierung von __dict__ ohne _state enthalten zurückgegeben?

+0

möglich Duplikat [django WebAPI: dump django Modell zu JSON] (http://stackoverflow.com/questions/16155277/django-webapi-dump-django-model-to-json) – FallenAngel

+0

@FallenAngel Serialisierung was 'alles() 'Rückkehr ist trivial, aber meine Frage ist über' get() '. Dies ist verwandt, aber kein Duplikat. – danijar

Antwort

13

model_to_dict() ist, was Sie brauchen:

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') 

Durch die Angabe fields und exclude Schlüsselwort Argumente können Sie steuern, was zu serialisiert Felder.

Sie können aber auch den try/except Block vereinfachen, indem Sie die Verknüpfung mit get_object_or_404():

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

Danke! Ich habe den benötigten Import zu Ihrer Frage hinzugefügt. Ich kann das Wörterbuch jedoch immer noch nicht serialisieren, da es ein Django-Bild enthält. Ich denke, das Wörterbuch müsste die Bild-URL anstelle des gesamten Django-Objekts enthalten. Irgendeine Idee? – danijar

+0

@danijar hm, wie verhält es sich mit dem Bildfeld? Irgendwelche Fehler? Könnten Sie auch versuchen, den integrierten Abfrage-Serializer wie hier vorgeschlagen zu verwenden (http://stackoverflow.com/a/1124531/771848)? Vielen Dank. – alecxe

+0

'model_to_dict()' gibt ein Dictionary wie '{'name': 'Foo', 'user': 1, 'logo': }' zurück, das nicht serialisiert werden kann. Die Django-Serialisierer umschließen das Feldwörterbuch in einem anderen, das ich nicht will. – danijar

0

Ich fand heraus, dass ist tatsächlich möglich values() zusammen zu verwenden, mit get(). Sie müssen nur Werte aus einem gefilterten Set abrufen.

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

Überprüfung der Quellcode django/core/Serializer/__init__ Py Kommentar:

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", 
    } 

für ein Objekt

json = serializers.serialize("json", some_queryset[0:1]) 
Verwandte Themen