Skip to content Skip to sidebar Skip to footer

Django Serializers To Json - Custom Json Output Format

I am quite new to django and recently I have a requirement of a JSON output, for which I use the following django code: data = serializers.serialize('json', Mymodel.objects.all())

Solution 1:

You can add 'fields' parameter to the serialize-function, like this:

data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size'))

See: https://docs.djangoproject.com/en/dev/topics/serialization/

EDIT 1:

You can customize the serializer to get only the fields you specify.

From Override Django Object Serializer to get rid of specified model:

from django.core.serializers.python import Serializer

classMySerialiser(Serializer):
    defend_object( self, obj ):
        self._current['id'] = obj._get_pk_val()
        self.objects.append( self._current )

 # views.py
 serializer = MySerialiser()
 data = serializer.serialize(some_qs)

Solution 2:

You'll need to write a custom Json serializer. Something like this should do the trick:

classFlatJsonSerializer(Serializer):
    defget_dump_object(self, obj):
        data = self._current
        ifnot self.selected_fields or'id'in self.selected_fields:
            data['id'] = obj.idreturn data

    defend_object(self, obj):
        ifnot self.first:
            self.stream.write(', ')
        json.dump(self.get_dump_object(obj), self.stream,
                  cls=DjangoJSONEncoder)
        self._current = Nonedefstart_serialization(self):
        self.stream.write("[")

    defend_serialization(self):
        self.stream.write("]")

    defgetvalue(self):
        returnsuper(Serializer, self).getvalue()

The you can use it like this:

s = FlatJsonSerializer()
s.serialize(MyModel.objects.all())

Or you could register the serializer with django.core.serializers.register_serializer and then use the familiar serializers.serialize shortcut.

Take a look at the django implementation as a reference if you need further customization: https://github.com/django/django/blob/master/django/core/serializers/json.py#L21-62

Solution 3:

I just came across this as I was having the same problem. I also solved this with a custom serializer, tried the "EDIT 1" method but it didn't work too well as it stripped away all the goodies that the django JSON encoder already did (decimal, date serialization), which you can rewrite it yourself but why bother. I think a much less intrusive way is to inherit the JSON serializer directly like this.

from django.core.serializers.json import Serializer
from django.utils.encoding import smart_text    

classMyModelSerializer(Serializer):
    defget_dump_object(self, obj):
        self._current['id'] = smart_text(obj._get_pk_val(), strings_only=True)
        return self._current

Sso the main culprit that writes the fields and model thing is at the parent level python serializer and this way, you also automatically get the fields filtering that's already built into django's JSON serializer. Call it like this

serializer = MyModelSerializer()
data = serializer.serialize(<queryset>, <optional>fields=('field1', 'field2'))

Solution 4:

importjson_all_data= Reporter.objects. all()

json_data = json.dumps([{'name': reporter.full_name} for reporter in _all_data])

return HttpResponse(json_data, content_type='application/json')

Here Reporter is your Model

Post a Comment for "Django Serializers To Json - Custom Json Output Format"