2012-03-13 64 views
3

我有一个简单的模型,有一个id和一个名称tastypie ModelResource。Django-tastypie - 如何生成定制的xml

XML输出如下所示。但我想用我的模型名称代替“对象”。我似乎在如何解决这个问题上挣扎不已 - 对此有何快速帮助?非常感谢 - 真的!

<response> 
    <objects type="list"> 
    <object> 
     <id>1</id> 
     <name>foo1</name> 
     <resource_uri> blah </resource_uri> 
    </object> 
    <object> 
     <id>2</id> 
     <name>foo2</name> 
     <resource_uri> blah </resource_uri> 
    </object> 
    </objects> 
</response> 

回答

3

您可以尝试重载Resource类的“alter_list_data_to_serialize(...)”方法。由于文档字符串说:

钩来改变列表数据是被序列&发送到用户之前。

用于重构/重命名将发送内容的各个方面。

所以这就是当你改变“数据”后不久被转换成XML并发送给用户的地方。

像这样的东西应该让你去:

def alter_list_data_to_serialize(self, request, data): 
    #self.object_class.lower() is the name you'd like instead of "objects" 
    data = { self.object_class.lower() : [ element for element in data[ 'objects' ] ] } 
    return data 

我没有测试过这一点,但我用这个方法来改变我的反应如何看待成功地。

+0

嗯 - 这看起来像一个相当重量级的解决方案,因为你必须从数据库中提取所有对象,然后提取ID。看起来最好能够提前做到这一点,以便我们只提取ID。 – shreddd 2012-05-30 23:51:08

+0

我认为它不会增加任何额外的东西。在Tastypie从数据库中提取适当的数据集(并存储在'data'中)之后调用此方法。所以唯一额外的开销就是'dict'创建,但如果要改变某些东西,这是无法避免的。另外OP要求改变XML结构,但要包含所有属性,所以这回答了他/她的问题。只拉对象属性的一个子集是另一回事。 – kgr 2012-05-31 08:27:48

+0

是的 - 我的评论与获得attrs的一个子集有关,正如你所指出的,这是另一个故事。 :) – shreddd 2012-05-31 20:14:06