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

如何在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

我正在尝试更改根目录和列表项的名称,以符合API的要求。我不想更改renderer.py中的XMLRenderer类,因为我可能会再次使用它,我只想使用view进行自定义

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

序列化程序类

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,数据)
可以随意添加或删除派生类的部分