django序列化器到json - 自定义json输出格式

时间:2013-03-16 18:34:16

标签: python django json

我是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": .....}]

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

4 个答案:

答案 0 :(得分:6)

您可以将“fields”参数添加到serialize-function,如下所示:

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)

答案 1 :(得分:4)

您需要编写自定义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

答案 2 :(得分:2)

我刚遇到这个,因为我遇到了同样的问题。我也用一个自定义的序列化器解决了这个问题,尝试了“编辑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'))

答案 3 :(得分:0)

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')

这里的记者是你的模特