创建类对象列表

时间:2016-03-17 09:14:21

标签: python list class object

我正在尝试创建一个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中的新手,我无法找到我出错的地方。

任何人都可以帮助我获得我期望的结果。

1 个答案:

答案 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.findAllcloudkittyclient.common.base.CrudManager.list,因为您的方法类似list_invoice

report_manager.findAll()

report_manager.findAll(all_tenants=all_tenants)

其中all_tenants是一个变量,其中包含您传递给自定义list_invoice方法的内容。

最后,如果findAllCrudManager.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}}方法,因为它似乎是做这种事情的方法。