我正在尝试创建一个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()
所以这里我的要求是“return self.client.get(url).json()”应该返回上面提到的由类对象组成的List。
但它返回的结果如下:
[{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 :(得分: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._get
内部查看self.client.get(url).json()
内部的内容,然后将JSON
反序列化为self.resource_class
实例。你可能不应该直接这样做。
cloudkittyclient.common.base.CrudManager
在内部使用_get
并提供覆盖get
,以便为您处理base_url
catenation等。
此外,您似乎应该使用cloudkittyclient.common.base.CrudManager.findAll
或cloudkittyclient.common.base.CrudManager.list
,因为您的方法类似list_invoice
。
report_manager.findAll()
或
report_manager.findAll(all_tenants=all_tenants)
其中all_tenants
是一个变量,其中包含您传递给自定义list_invoice
方法的内容。
最后,如果findAll
或CrudManager.list
真的不适合您的需求,因为您的集合网址与类中的网址不同,您必须反序列化{的结果{1}}你自己。所以不要回来,而是
self.client.get(url).json()
从python return [self.resource_class(self, j, loaded=True)
for j in self.client.get(url).json() if j]
ionaries创建一个self.resource_class
类(ReportResult
的实例)列表,这些实例已从dict
数据的响应中反序列化。
考虑重载JSON
的{{1}}方法,因为它似乎是做这种事情的方法。