¿Cómo JSON serializar __dict__ de un modelo Django?

Quiero serializar los valores de un modelo único en Django. Como quiero usar get() , los values() no están disponibles. Sin embargo, leí en Grupos de Google que puedes acceder a los valores con __dict__ .

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

La statement de impresión produce esto.

 {'_state': , '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': 'contact@example.com'} 

Debido a la clave _state que contiene un valor no serializable, la siguiente línea falla con este error.

  is not JSON serializable 

¿Cómo puedo serializar el diccionario devuelto desde __dict__ sin que se __dict__ ?

model_to_dict() es lo que necesitas:

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

Al especificar fields y exclude argumentos de palabras clave, puede controlar qué campos se serializarán.

Además, puede simplificar el bloque try/except mediante el acceso directo get_object_or_404() :

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

verifique el código fuente django / core / serializers / __init__ .py comentario:

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

por un objeto

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

Descubrí que es posible usar values() junto con get() . Solo tienes que obtener los valores de un conjunto filtrado.

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