0

Django-Restフレームワークを初めて使用しています。私はanswer from hereに基づいXMLRendererをオーバーライドしてきましたDjango Rest Frameworkルート項目を変更し、項目の要素名をリストする

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

、私:へ

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

:から

:私は、ルートとモデル名に応じて、リスト項目の要素名を変更したいですこれを私の視点にどのようにルーティングするのか分かりません。

マイビュー:

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)) 

答えて

0

我々は方法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")] 
関連する問題