2016-03-17 197 views
-1

我想創建一個python類對象列表。創建類對象列表

基本上我期待的名單應該是如下:

[<Report {u'invoice_id': u'demo-1-2016-dummy', u'tenant_id': u'27724b57e3b744f89cbf1336da062b43'}>, <Report {u'invoice_id': u'demo-2-2016', u'tenant_id': u'27724b57e3b744f89cbf1336da062b43'}>, <Report {u'invoice_id': u'admin-2-2016', u'tenant_id': u'6cd02afa3f0f403489153c41e98d07bc'}>] 

我已經嘗試了同樣的下面的代碼。

from cloudkittyclient.common import base 
import json 

class ReportResult(base.Resource): 

    key = 'report' 

    def __repr__(self): 
     return "<Report %s>" % self._info 

class ReportManager(base.CrudManager): 

    base_url = '/v1/report' 
    resource_class = ReportResult 
    key = "report" 
    collection_key = "reports" 

    # List the invoices, can accept all-tenants arg 
    def list_invoice(self, all_tenants=None): 
     url = self.base_url + "/list_invoice" 
     filters = list() 
     if all_tenants: 
      filters.append("all_tenants=%s" % all_tenants) 
     if filters: 
      url += "?%s" % ('&'.join(filters)) 
     return self.client.get(url).json() 

所以在這裏我的要求是,「迴歸self.client.get(URL)以.json()」應該返回上述名單其中包括類的對象。

但它返回的結果如下:

[{u'invoice_id': u'demo-1-2016-dummy', u'tenant_id': u'27724b57e3b744f89cbf1336da062b43'}, {u'invoice_id': u'demo-2-2016', u'tenant_id': u'27724b57e3b744f89cbf1336da062b43'}, {u'invoice_id': u'admin-2-2016', u'tenant_id': u'6cd02afa3f0f403489153c41e98d07bc'}] 

我知道我失去了一些東西在這裏的事實。

由於我是python的新手用戶,我無法找到我要出錯的地方。

任何人都可以幫助我得到我期望的結果。

+0

請停止使用'repr'字符串作爲序列化。 'return self.client.get(url).json()'正在返回:python'dict'ionaries的'list',然後可以序列化爲JSON進行傳輸。 –

+0

幾乎不需要與類對象相同的列表。這正是我想要實現的。 – iamnewuser

+0

[SQLALchemy和Python - 獲取SQL結果]的可能重複(http://stackoverflow.com/questions/35407120/sqlalchemy-and-python-getting-the-sql-result) –

回答

3

TL; DR

return [self.resource_class(self, j, loaded=True) 
     for j in self.client.get(url).json() if j] 

你不應該自己處理URL創建。如果您使用所提供的方法,CrudManager應爲您照顧。

嘗試

report_manager.get(report_id=my_report_id) 

其中my_report_id是包含ID的變量,如果你想,而不是

report_manager.client.get(url).json() 

展望cloudkittyclient.openstack.common.apiclient.base.BaseManager._getself.client.get(url).json()是什麼,它對取一個報告,在內部之前,它將JSON反序列化爲self.resource_class實例。你可能不應該直接這樣做。

cloudkittyclient.common.base.CrudManager在內部使用_get,並提供覆蓋get,將處理base_url catenation等你。

另外它似乎你應該使用cloudkittyclient.common.base.CrudManager.findAllcloudkittyclient.common.base.CrudManager.list,因爲你有一個方法,如list_invoice

report_manager.findAll() 

report_manager.findAll(all_tenants=all_tenants) 

其中all_tenants是什麼都將傳遞給您的自定義list_invoice方法的變量。

最後,如果findAllCrudManager.list是真的不適合你的需求,這似乎是因爲您的收藏網址從一個類中的不同是這種情況,你要反序列化的self.client.get(url).json()自己的結果。因此,而不是返回的是,做

return [self.resource_class(self, j, loaded=True) 
     for j in self.client.get(url).json() if j] 

它創建從已經從JSON數據的響應反序列化蟒蛇dict ionaries self.resource_class類(ReportResult這裏)的實例的列表。

考慮超載list方法CrudManager,因爲它似乎是做這種事情的方式。

+0

謝謝,但它給出了一個錯誤:TypeError:get()只需要1個參數(給出2) – iamnewuser

+0

真的,'get()'只需要kwargs。它接受諸如'base_url',''%s_id'%self.key' - >'report_id'等內容。 –

+0

@iamnewuser請嘗試使用ReportManager實例的findAll方法。 –