首页 > 解决方案 > Django REST 框架和 XML。更改 item_tag_name、root_tag_name 等

问题描述

我根据快速入门在我的项目中设置了一个休息框架, 一切正常,但是,正如它通常发生的那样,并非没有问题!

  1. 我的serializer.py

    类 kvSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = kv
        fields = ['title', 'price', 'address']
    
  2. 我的意见.py

    类 kvViewSet(viewsets.ModelViewSet):

    queryset = listings.objects.all()
    serializer_class = kvSerializer
    
  3. 我的XML

    对象标题 100 对象地址

问题:

  1. 如何更改标签<root><list-item>

    <root>应该叫<feed>

    <list-item>应该叫<offer>

  2. 标签前<offer>需要插入标签<creation-date>

我的最终 XML 应如下所示:

<feed>
<creation-date>Date</creation-date>
<offer id=1>
    <title>
    Object title
    </title>
    <price>100</price>
    <address>
    object address
    </address>
</offer>
<offer id=2>
    <title>
    Object title
    </title>
    <price>100</price>
    <address>
    object address
    </address>
</offer>
</feed>

标签: djangodjango-rest-framework

解决方案


这不是序列化器的一部分,而是渲染器的一部分。您可以在ModelViewSet. 我们可以安装一个简单的渲染器:

pip install djangorestframework-xml

XmlRenderer然后我们可以通过子类化并覆盖该_to_xml方法来创建自定义渲染器:

from rest_framework_xml.renderers import XMLRenderer

class KvXMLRenderer(XMLRenderer):
    root_tag_name = 'feed'
    item_tag_name = 'offer'
    creation_tag_name = 'creation-date'

    def _to_xml(self, xml, data):
        xml.startElement(self.creation_tag_name, {})
        xml.characters('string-of-creation-date')
        xml.endElement(self.creation_tag_name)
        super()._to_xml(xml, data)

然后我们可以使用我们的自定义渲染renderer_classesModelViewSet

class kvViewSet(viewsets.ModelViewSet):
    queryset = listings.objects.all()
    serializer_class = kvSerializer
    renderer_classes = [KvXmlRenderer]

推荐阅读