自定义Django中的JSON序列化器

2 投票
1 回答
2327 浏览
提问于 2025-04-20 05:06

我正在处理一个Django的查询集(queryset),它给我的输出是这样的:

[{"pk": 3, "model": "appname.somemodel", "fields": {"name": "value", "name": "value" }}]

我只对字段感兴趣,所以我想要重写(override)这个序列化器。

我尝试过:

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,发现序列化器确实有一个叫 objects 的列表,那这个问题到底是什么原因呢?

Django有没有办法在我的序列化输出中省略 pkmodel 这两个字段呢?

1 个回答

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

撰写回答