覆盖Django对象序列化器以摆脱指定的模型

Asd*_*sdf 3 django serialization overriding object

我需要将Django Queryset对象转换为Json字符串.内置的Django Serialization库非常有用.虽然它从创建它的位置指定模型的名称.既然我不需要这个,我怎么摆脱它呢?我还需要覆盖什么才能使用下面重写的end_object方法?

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
Run Code Online (Sandbox Code Playgroud)

Asd*_*sdf 10

对不起,我完全忘记了这个问题.这就是我最终解决它的方式(感谢#django上的FunkyBob):

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)
Run Code Online (Sandbox Code Playgroud)


tbm*_*tbm 5

这是一个序列化程序,它从序列化输出中删除所有元数据(pk、模型),并将字段向上移动到每个对象的顶层。在 django 1.5 中测试

from django.core.serializers import json


class CleanSerializer(json.Serializer):

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


Serializer = CleanSerializer
Run Code Online (Sandbox Code Playgroud)

编辑:

在将我的应用程序迁移到旧版本的 django 时(由于托管提供商的更改而导致),上述序列化程序停止工作。下面是处理引用版本的序列化器:

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
Run Code Online (Sandbox Code Playgroud)