I want to serialize the values of a single model in Django. Because I want to use get()
, values()
is not available. However, I read on Google Groups that you can access the values with __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')
The print statement outputs this.
{'_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]'}
Because of the _state
key that holds an unserializable value the next line fails with this error.
<django.db.models.base.ModelState object at 0x0000000005556EF0> is not JSON serializable
How can I serialize the dictionary returned from __dict__
without _state
being included?
To properly serialize an object so that it works even for json. dumps(), you need to write a custom to_json() method. The first instinct is to replace the default method in JSONEncoder with to_json() and have it call __str__.
Use toJSON() Method to make class JSON serializable So we don't need to write custom JSONEncoder. This new toJSON() serializer method will return the JSON representation of the Object. i.e., It will convert custom Python Object to JSON string.
model_to_dict()
is what you need:
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')
By specifying fields
and exclude
keyword arguments you can control what fields to serialize.
Also, you can simplify the try/except
block by using the shortcut get_object_or_404()
:
model = get_object_or_404(Customer, id=id, user=1)
check the source code django/core/serializers/__init__.py comment:
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",
}
for one object
json = serializers.serialize("json", some_queryset[0:1])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With