【问题标题】:django serializers to json - custom json output formatdjango 序列化器到 json - 自定义 json 输出格式
【发布时间】:2013-03-05 09:17:55
【问题描述】:

我对 django 很陌生,最近我需要一个 JSON 输出,为此我使用以下 django 代码:

data = serializers.serialize("json", Mymodel.objects.all())

效果很好,只是我得到了以下输出:

[{"pk": 8970859016715811, "model": "myapp.mymodel", "fields": {"reviews": "3.5", "title": .....}}]

但是,我希望输出简单:

[{"reviews": "3.5", "title": .....}]

或者,

[{"id": "8970859016715811", "reviews": "3.5", "title": .....}]

我想知道是否有人可以为我指出如何实现这一目标的正确方向。

【问题讨论】:

    标签: python django json


    【解决方案1】:

    您可以在序列化函数中添加“字段”参数,如下所示:

    data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size'))
    

    见:https://docs.djangoproject.com/en/dev/topics/serialization/

    编辑 1:

    您可以自定义序列化程序以仅获取您指定的字段。

    来自Override Django Object Serializer to get rid of specified model

    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)
    

    【讨论】:

    • 我试过了 - 但它仍然输出我不需要的"pk": 8970859016715811, "model": "myapp.mymodel", "fields":
    • 由于某种原因,您在 edit-1 上的链接不起作用。所以,我包含了这个类并像这样传递了查询集:data = serializer.serialize(mymodel.objects.all()) out = open("djangojson.json", "w") out.write(data) out.close() 我得到了以下错误:TypeError: expected a character buffer object 这是我以前没有得到的。
    【解决方案2】:

    您需要编写一个自定义的 Json 序列化程序。像这样的东西应该可以解决问题:

    class FlatJsonSerializer(Serializer):
        def get_dump_object(self, obj):
            data = self._current
            if not self.selected_fields or 'id' in self.selected_fields:
                data['id'] = obj.id
            return data
    
        def end_object(self, obj):
            if not self.first:
                self.stream.write(', ')
            json.dump(self.get_dump_object(obj), self.stream,
                      cls=DjangoJSONEncoder)
            self._current = None
    
        def start_serialization(self):
            self.stream.write("[")
    
        def end_serialization(self):
            self.stream.write("]")
    
        def getvalue(self):
            return super(Serializer, self).getvalue()
    

    你可以这样使用它:

    s = FlatJsonSerializer()
    s.serialize(MyModel.objects.all())
    

    或者您可以使用django.core.serializers.register_serializer 注册序列化程序,然后使用熟悉的serializers.serialize 快捷方式。

    如果您需要进一步定制,请查看 django 实现作为参考:https://github.com/django/django/blob/master/django/core/serializers/json.py#L21-62

    【讨论】:

    • @rtindru 对不起,我没明白你的意思,你能详细说明你的问题吗?或者也许一个带有一些代码的新问题会更好
    • self.first - 没有字段优先
    • 能否举例说明如何使用 register_serializer 进行注册
    【解决方案3】:

    我刚刚遇到这个问题,因为我遇到了同样的问题。我还使用自定义序列化程序解决了这个问题,尝试了“EDIT 1”方法,但它并没有很好地工作,因为它剥夺了 django JSON 编码器已经完成的所有好东西(十进制,日期序列化),你可以重写它你自己,但为什么要打扰。我认为一种不那么侵入性的方法是像这样直接继承 JSON 序列化器。

    from django.core.serializers.json import Serializer
    from django.utils.encoding import smart_text    
    
    class MyModelSerializer(Serializer):
        def get_dump_object(self, obj):
            self._current['id'] = smart_text(obj._get_pk_val(), strings_only=True)
            return self._current
    

    Sso 编写字段和模型的罪魁祸首是在父级 python 序列化程序中,这样,您还可以自动获取已经内置到 django 的 JSON 序列化程序中的字段过滤。像这样称呼它

    serializer = MyModelSerializer()
    data = serializer.serialize(<queryset>, <optional>fields=('field1', 'field2'))
    

    【讨论】:

    • django 1.4.1 在 django.utils.encoding 中没有 smart_text
    • 好吧...然后去掉 1.4.1 的父级 get_dump_object 中的任何代码。主旨是从原始来源尽可能少地改变。
    【解决方案4】:
    import json
    
    _all_data = Reporter.objects. all()
    
    json_data = json.dumps([{'name': reporter.full_name} for reporter in _all_data])
    
    return HttpResponse(json_data, content_type='application/json')
    

    这里的记者是你的模特

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2014-07-24
      • 2016-01-07
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2018-10-27
      • 2014-10-05
      相关资源
      最近更新 更多