2012-03-13 66 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