在Django中自定义JSON序列化程序

时间:2014-09-06 18:55:53

标签: python json django serialization jsonserializer

我正在序列化一个Django查询集,它给出了像

这样的输出
[{"pk": 3, "model": "appname.somemodel", "fields": {"name": "value", "name": "value" }}]

我只对这些领域感兴趣。所以我试图重写序列化器。

我试过了

from django.core.serializers.json import Serializer

class JSONSerializer(Serializer):
    def end_serialization(self):
        for i, obj in enumerate(self.objects):
            self.objects[i] = obj.get('fields', {})
        return super(JSONSerializer, self).end_serialization()

但是我收到属性错误:

'JSONSerializer' object has no attribute 'objects'

我已经检查了https://github.com/django/django/blob/master/django/core/serializers/python.py,而且Serializer确实有一个名为objects的列表,那么是什么导致了这个问题呢?

Django是否可以从序列化输出中省略pkmodel

1 个答案:

答案 0 :(得分:2)

在json.Serializer方法中,end_serialization被完全覆盖,所以为了理解它是如何工作的,你需要看到这个https://github.com/django/django/blob/master/django/core/serializers/json.py

在方法get_dump_object中添加了属性pk和model,因此您需要覆盖它。

例如:

from django.core.serializers.json import Serializer

class JSONSerializer(Serializer):
    def get_dump_object(self, obj):
        return self._current or {}

使用id:

class JSONSerializer(Serializer):
    def get_dump_object(self, obj):
        dump_object = self._current or {}
        dump_object.update({'pk': smart_text(obj._get_pk_val(), strings_only=True)})
        return dump_object