Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Override Django Object Serializer to get rid of specified model

I need to convert a Django Queryset Object into a Json string. The built in Django Serialization library works great. Although it specifies the name of the Model from where it was created. Since I don't need this, how do I get rid of it? What else do I need to override to be able to use the overridden end_object method below?

class Serializer(PythonSerializer):
    def end_object(self, obj):
        self.objects.append({
            "model"  : smart_unicode(obj._meta), # <-- I want to remove this
            "pk"     : smart_unicode(obj._get_pk_val(), strings_only=True),
            "fields" : fields
        })  
        self._current = None
like image 779
Asdf Avatar asked Nov 30 '22 08:11

Asdf


2 Answers

Sorry I had totally forgot about this question. This is how I ended up solving it (with thanks to FunkyBob on #django):

from django.core.serializers.python import Serializer

class MySerialiser(Serializer):
    def end_object( self, obj ):
        self._current['id'] = obj._get_pk_val()
        self.objects.append( self._current )

 # views.py
 serializer = MySerialiser()
 data = serializer.serialize(some_qs)
like image 59
Asdf Avatar answered May 20 '23 22:05

Asdf


Here's a serializer that removes all metadata (pk, models) from the serialized output, and moves the fields up to the top-level of each object. Tested in django 1.5

from django.core.serializers import json


class CleanSerializer(json.Serializer):

    def get_dump_object(self, obj):
        return self._current


Serializer = CleanSerializer

Edit:

In migrating my app to an older version of django (precipitated by a change in hosting provider), the above serializer stopped working. Below is a serializer that handles the referenced versions:

import logging
import django

from django.core.serializers import json
from django.utils.encoding import smart_unicode


class CleanSerializer148(json.Serializer):

    def end_object(self, obj):
        current = self._current
        current.update({'pk': smart_unicode(obj._get_pk_val(),
                                            strings_only=True)})
        self.objects.append(current)
        self._current = None


class CleanSerializer151(json.Serializer):

    def get_dump_object(self, obj):
        self._current['pk'] = obj.pk
        return self._current


if django.get_version() == '1.4.8':
    CleanSerializer = CleanSerializer148

else:
    CleanSerializer = CleanSerializer151


Serializer = CleanSerializer
like image 22
tbm Avatar answered May 20 '23 22:05

tbm