10

我对 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

4 回答 4

7

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

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

请参阅:https ://docs.djangoproject.com/en/dev/topics/serialization/

编辑1:

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

Override Django Object Serializer 摆脱指定的模型

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)
于 2013-03-16T18:41:19.973 回答
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

于 2013-11-05T19:39:08.830 回答
2

我刚刚遇到这个问题,因为我遇到了同样的问题。我还使用自定义序列化程序解决了这个问题,尝试了“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'))
于 2013-11-24T02:46:05.890 回答
1
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')

这里的记者是你的模特

于 2016-01-05T16:42:50.327 回答