简体   繁体   中英

Django Rest Framework change root item and list item element name

I am new to Django-Rest framework. I want to change root and list-item element name depending upon model names:

From:

<root>
    <list-item>worrier1</list-item>
    <list-item>worrier2</list-item>
<root>

To:

<tests>
    <test>worrier1</test>
    <test>worrier2</test>
<tests>

I've overridden the XMLRenderer based on answer from here , but I'm not sure how to route this to my view.

My View:

class SampleViewSet(viewsets.ModelViewSet):

    myrenderer = ModifiedXMLRenderer(item_tag="tests", root_tag="test")

    queryset = Sample.objects.all()
    serializer_class = SampleSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

ModifiedXMLRenderer:

class ModifiedXMLRenderer(XMLRenderer):


    def __init__(self, item_tag=None,root_tag=None):
        self.item_tag_name = item_tag or "item"
        self.root_tag_name = root_tag or "channel"

    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders `data` into serialized XML.
        """
        if data is None:
            return ''

        stream = StringIO()

        xml = SimplerXMLGenerator(stream, self.charset)
        xml.startDocument()
        xml.startElement(self.root_tag_name, {})

        self._to_xml(xml, data)

        xml.endElement(self.root_tag_name)
        xml.endDocument()
        return stream.getvalue()

    def _to_xml(self, xml, data):
        if isinstance(data, (list, tuple)):
            for item in data:
                xml.startElement(self.item_tag_name, {})
                self._to_xml(xml, item)
                xml.endElement(self.item_tag_name)

        elif isinstance(data, dict):
            for key, value in six.iteritems(data):
                xml.startElement(key, {})
                self._to_xml(xml, value)
                xml.endElement(key)

        elif data is None:
            # Don't output any value
            pass

        else:
            xml.characters(force_text(data))

we can achieve it by overriding the method get_renderers .

class SampleViewSet(viewsets.ModelViewSet):
   queryset = Sample.objects.all()
   serializer_class = SampleSerializer
   permission_classes = [IsAuthenticatedOrReadOnly]

   def get_renderers(self):
      return [ModifiedXMLRenderer(item_tag="tests", root_tag="test")]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM