如何在django视图中更改XML API中的根和项列表名称
我正在尝试更改根目录和列表项的名称,以符合API的要求。我不想更改renderer.py中的XMLRenderer类,因为我可能会再次使用它,我只想使用view进行自定义 以下是序列化程序类、视图类和输出 序列化程序类如何在django视图中更改XML API中的根和项列表名称,django,django-rest-framework,Django,Django Rest Framework,我正在尝试更改根目录和列表项的名称,以符合API的要求。我不想更改renderer.py中的XMLRenderer类,因为我可能会再次使用它,我只想使用view进行自定义 以下是序列化程序类、视图类和输出 序列化程序类 class CategorySerializer(serializers.ModelSerializer): class Meta: model = TypeCategory fields = '__all__' class ZoneS
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>
正常的
5.
正常的
1.
地带
9
区域经理
4.
10
特区官员
4.
在项目中的renderer.py文件中扩展XMLRenderer,并覆盖根标记名称和项标记名称,如下所示:
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)
从rest\u framework\u xml.renders导入XMLRenderer
类MyXMLRenderer(XMLRenderer):
“”“序列化为XML的自定义根呈现程序”“”
root\u tag\u name=“我的自定义根”
item\u tag\u name=“我的item tag”
定义到xml(自我、xml、数据):
"""
在dict内打印列表,标记名=与列表关联的键
例如
我的清单=['a','b','c']
my_dict={'my_元素:my_列表}
将呈现为:
A.
B
C
"""
如果存在(数据、指令):
对于键,data.items()中的值:
如果isinstance(值,(列表,元组)):
对于有价值的项目:
startElement(键,{})
self._to_xml(xml,item)
xml.endElement(键)
其他:
startElement(键,{})
self.\u到\u xml(xml,值)
xml.endElement(键)
其他:
super()._to_xml(xml,数据)
可以随意添加或删除派生类的部分