我是django-rest-framework的新手,我有像
这样的工作样本<root>
<list-item>worrier1</list-item>
<list-item>worrier2</list-item>
<root>
我需要的是
<Hero>
<worrier1>worrier1</worrier1>
<worrier2>worrier2</worrier2>
<Hero>
答案 0 :(得分:3)
本着帮助搜索此内容的其他人的精神......以下是如何将XMLRenderer子类化并覆盖根标记(以前称为“root”)和项目标记(以前称为“list-item”)无论你喜欢什么。
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))
答案 1 :(得分:1)
我认为你不需要创建一个完整的子类,我可以通过在创建实例之后和运行render之前覆盖实例变量来实现它,见下文:
renderer = XMLRenderer()
renderer.item_tag_name = 'warrior'
renderer.root_tag_name = 'Hero'
content = renderer.render(serializer.data)
希望能帮助其他任何偶然发现的人
答案 2 :(得分:1)
如果您希望通用地执行此操作,则无需重写过多的类:
class MyXMLRenderer(XMLRenderer):
"""Override XML tag names."""
root_tag_name = 'file'
item_tag_name = 'instance'
答案 3 :(得分:0)
这些是硬编码的值,因此您获得的唯一机会是通过覆盖XMLRenderer
(实际上几乎是整个类)来创建自定义渲染器,并在视图中使用该自定义渲染器。 / p>
答案 4 :(得分:0)
对于想编辑实际软件包的任何人,您都可以转到Python文件夹,站点软件包,rest_framework_xml并编辑renderers.py
到达那里后,您可以编辑:
item_tag_name = 'list-item'
并将其更改为item_tag_name = 'item'
注意: 通过执行此方法,您将覆盖实际的类。对于我的项目而言,没关系,但是如果您打算将xml库用于另一个Django项目,请记住这一点。