Skip to main content
 首页 » 编程设计

python之使用 TastyPie 自定义输出 XML(带有属性)

2025年05月04日11java哥

如果这不是发布此内容的正确区域,我提前道歉,但我似乎无法在文档或 Stack Overflow 上找到任何帮助。 TastyPie 很棒,我已经能够非常接近所需的 XML 输出。但是,当我想在节点上拥有自定义属性时,问题就出现了。我似乎无法找到一种方法来使用 TastyPie 来执行此操作,除非从头开始编写 API。

例如,假设我有来自 TastyPie 的示例输出(仅摘录):

<media type="list"> 
<object type="hash"> 
    <filename>filename.mp4</filename> 
    <id type="integer">62</id> 
    <name>AE</name> 
    <position type="integer">0</position>  
    <product type="integer">65</product> 
    <type>video</type> 
</object> 
<object type="hash"> 
    <filename>filename.jpg</filename> 
    <id type="integer">63</id> 
    <name>Some Name</name> 
    <position type="integer">1</position>  
    <product type="integer">65</product> 
    <type>image</type> 
</object> 
</media> 

我真正需要的是这个(注意我想向节点添加一个(或多个)自定义属性 - 在这种情况下,文件名有一个属性):

<media type="list"> 
<object type="hash"> 
    <filename type="video">filename.mp4</filename> 
    <id type="integer">62</id> 
    <name>Some Name</name> 
    <position type="integer">0</position>  
    <product type="integer">65</product> 
</object> 
<object type="hash"> 
    <filename type="image">filename.jpg</filename> 
    <id type="integer">63</id> 
    <name>Another Name</name> 
    <position type="integer">1</position>  
    <product type="integer">65</product> 
</object> 
</media> 

或者更好的是,这个:

<media type="list"> 
    <object type="hash" format="video" id="62" position="0" product_type="65" filename="filename.mp4" name="Some Name" /> 
    <object type="hash" format="image" id="63" position="1" product_type="65" filename="filename.jpg" name="Another Name" /> 
</media> 

要自定义 XML 序列化程序以在需要的地方添加属性,需要什么? 或者更好的是,告诉它哪些值可以安全地描述为属性而不是节点?我不明白如何将属性添加到输出 XML。任何帮助是极大的赞赏。提前致谢。

请您参考如下方法:

好吧,我得到了答案,但不是我自己的。感谢波兰的 Omelyanyk Andrey 提供了这个工作代码……这让我到达了我需要去的地方,并且允许我进一步自定义,因为我有工作代码可以学习。

class MySerializer(Serializer): 
    def format_datetime(self, data): 
        return utc_to_est_human(data) 
 
    def format_date(self, data): 
        return data.strftime("%Y-%m-%d") 
 
    def to_xml(self, data, options=None): 
        """ 
        Given some Python data, produces XML output. 
        """ 
        options = options or {} 
 
        if lxml is None: 
            raise ImproperlyConfigured("Usage of the XML aspects requires lxml and defusedxml.") 
 
        etree = self.to_etree(data, options) 
 
        for element in  etree.xpath('//media/object'): 
            for child in element.getchildren(): 
                element.set(child.tag, child.text) 
                element.remove(child) 
 
        return tostring(etree, encoding='utf-8')