Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to JSON serialize __dict__ of a Django model?

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?

like image 240
danijar Avatar asked Apr 19 '14 12:04

danijar


People also ask

How do I serialize a Python object to JSON?

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__.

How do I make an object JSON serializable?

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.


2 Answers

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)
like image 139
alecxe Avatar answered Oct 19 '22 00:10

alecxe


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])
like image 34
vadimchin Avatar answered Oct 18 '22 23:10

vadimchin