【问题标题】:Customize JSON serializer in Django在 Django 中自定义 JSON 序列化程序
【发布时间】: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

【问题讨论】:

    标签: python json django serialization jsonserializer


    【解决方案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。
    • 太棒了。谢谢!但它不会序列化我的注释字段。这似乎很奇怪。它们在查询集中。
    猜你喜欢
    • 2021-09-21
    • 2019-05-07
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2014-07-08
    • 2014-10-05
    • 2016-12-09
    • 2011-02-25
    相关资源
    最近更新 更多