我是新来的Django的REST的框架我有这样的工作样品
<root>
<list-item>worrier1</list-item>
<list-item>worrier2</list-item>
<root>
我需要的是
<Hero>
<worrier1>worrier1</worrier1>
<worrier2>worrier2</worrier2>
<Hero>
我是新来的Django的REST的框架我有这样的工作样品
<root>
<list-item>worrier1</list-item>
<list-item>worrier2</list-item>
<root>
我需要的是
<Hero>
<worrier1>worrier1</worrier1>
<worrier2>worrier2</worrier2>
<Hero>
这些都是硬编码值,所以你得到的唯一的机会,就是通过重写创建自定义呈现XMLRenderer
(这实际上是几乎整个班级),并使用自定义的呈现在您的视图。
在被帮助的其他人谁该搜索...下面的精神是如何可以继承的XMLRenderer并重写根标签(以前的“根”)和项目标签(以前“列表项”),以任何你喜欢的。
from django.utils.six.moves import StringIO
from django.utils.xmlutils import SimplerXMLGenerator
from rest_framework_xml.renderers import XMLRenderer
class ModifiedXMLRenderer(XMLRenderer):
item_tag_name = "item"
root_tag_name = "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(smart_text(data))
我不认为你需要去这么远,创造出一个子类,我能够通过创建实例后重写实例变量和运行呈现之前,请参见下面这样做:
renderer = XMLRenderer()
renderer.item_tag_name = 'warrior'
renderer.root_tag_name = 'Hero'
content = renderer.render(serializer.data)
希望可以帮助其他人谁绊倒通过
如果你想一般做到这一点,你不需要重写太多类:
class MyXMLRenderer(XMLRenderer):
"""Override XML tag names."""
root_tag_name = 'file'
item_tag_name = 'instance'
谁想要编辑的实际的包,你可以去你的Python文件夹,站点包装,rest_framework_xml和编辑renderers.py
当你到达那里,你可以编辑: item_tag_name = 'list-item'
,并更改为item_tag_name = 'item'
注:通过这种方法,你将覆盖实际的类。 对于我的项目,也不要紧,但如果你打算使用XML库的另一个Django项目,只要记住这一点。