我是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": .....}]
我想知道是否有人可以指出我如何实现这一目标的正确方向。
答案 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')
这里的记者是你的模特