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

Posted

技术标签:

【中文标题】在 Django 中自定义 JSON 序列化程序【英文标题】:Customize JSON serializer in Django 【发布时间】:2014-10-31 10:59:31 【问题描述】:

我正在序列化一个 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】:

在 json.Serializer 方法中 end_serialization 完全被覆盖,因此要了解它是如何工作的,您需要查看 https://github.com/django/django/blob/master/django/core/serializers/json.py

属性pk和模型添加到get_dump_object方法中,所以你需要重写它。

例如:

from django.core.serializers.json import Serializer

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

带身份证:

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

【讨论】:

谢谢!它完成了这项工作。但是为什么列表中省略了id/pk?我什至尝试过JSONSerializer().serialize(self.get_queryset(), fields=('id','pk',)),但它不会打印 id。 太棒了。谢谢!但它不会序列化我的注释字段。这似乎很奇怪。它们在查询集中。

以上是关于在 Django 中自定义 JSON 序列化程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Django Rest Framework GET 调用中自定义 JSON 输出

如何在杰克逊序列化中自定义日期,@JsonSerialize 不起作用

支持嵌套类型中自定义类的默认序列化

jackson中自定义处理序列化和反序列化

如何在 django 1.5 中自定义用户模型

如何在 django 中自定义找不到页面(404)?