如何在django视图中更改XML API中的根和项列表名称



我试图更改根和列表项名称以满足API的要求。我不想更改render.py中的XMLRenderer类,因为我可能会再次使用它,我只想使用视图进行自定义。

以下是序列化程序类、视图类和输出

序列化程序类

class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = TypeCategory
fields = '__all__'

class ZoneSerializer(serializers.ModelSerializer):
type = CategorySerializer(many=True, read_only=True)
class Meta:
model = Type
fields = ('TypeDesc', 'type')

在视图

class ZoneLists(APIView):
renderer_classes = (JSONRenderer, XMLRenderer)
def get(self, request):
zone1 = Type.objects.all()
serializer = ZoneSerializer(zone1, many=True)
return Response(serializer.data)

输出

<root>
<list-item>
<TypeDesc>NORMAL</TypeDesc>
<type>
<list-item>
<id>5</id>
<Category>Normal</Category>
<Type>1</Type>
</list-item>
</type>
</list-item>
<list-item>
<TypeDesc>ZONES</TypeDesc>
<type>
<list-item>
<id>9</id>
<Category>Zone manager</Category>
<Type>4</Type>
</list-item>
<list-item>
<id>10</id>
<Category>zone officials</Category>
<Type>4</Type>
</list-item>
</type>
</list-item>
</root>

在项目中的render.py文件中扩展XMLRenderer,并覆盖root_tag_name和item_tag_name,如下所示:

from rest_framework_xml.renderers import XMLRenderer

class MyXMLRenderer(XMLRenderer):
"""Custom root renderer which serializes to XML"""
root_tag_name = "my-custom-root"
item_tag_name = "my-item-tag"
def _to_xml(self, xml, data):
"""
Print list inside dict with tag name = key associated to the list
e.g. 
my_list = ['a','b','c']
my_dict = {'my_element': my_list}
will be rendered as:
<my_element>a</my_element>
<my_element>b</my_element>
<my_element>c</my_element>
"""
if isinstance(data, dict):
for key, value in data.items():
if isinstance(value, (list, tuple)):
for item in value:
xml.startElement(key, {})
self._to_xml(xml, item)
xml.endElement(key)
else:
xml.startElement(key, {})
self._to_xml(xml, value)
xml.endElement(key)
else:
super()._to_xml(xml, data)

可以随意添加或删除派生类的部分。

最新更新