【问题标题】:Python: Loop over NDB entity modelPython:循环遍历 NDB 实体模型
【发布时间】:2015-07-07 19:35:04
【问题描述】:

我有一个类/NDB 实体模型定义如下:

class CashModel(ndb.Model):
    "Models a Cash record"
    # Name, Balance, Interest Rate
    accountName = ndb.StringProperty()
    interestRate = ndb.FloatProperty()
    balance = ndb.FloatProperty()
    accountType = ndb.StringProperty()
    futureView = ndb.JsonProperty()
    time_stored = ndb.DateTimeProperty(auto_now_add=True)

将值添加到 class 后,打印出来的内容如下所示:

CashModel(accountName=u'Bank', accountType=u'cash', balance=1000.0, futureView=None, interestRate=5.0, time_stored=datetime.datetime(2015, 7, 7, 18, 33, 3, 925601))

我如何循环这个类的键/值对,所以输出会是这样的:

accountName, Bank
accountType, cash
balance, 1000.0
futureView, None
interestRate, 5.0
time_stored, datetime.datetime(2015, 7, 7, 18, 33, 3, 925601)

查看了 S.O. 上的其他答案,但似乎没有一个合适的答案。使用内置方法的简单解决方案将是最好的。 TIA

【问题讨论】:

  • 你想要这个类的“漂亮”输出吗?

标签: python class google-app-engine google-cloud-datastore app-engine-ndb


【解决方案1】:

您可以使用to_dict(include=None, exclude=None) 实例方法将模型对象转换为字典,然后使用iteritems() 迭代键/值对

to_dict(include=None, exclude=None)

返回一个包含模型属性值的字典。

Check this link

【讨论】:

    【解决方案2】:

    向您的类添加一个__iter__() 方法,该方法从self.__dict__.items() 产生。

    >>> class Test:
            def __init__(self):
                self.a = 1
                self.b = 2
            def __iter__(self): yield from self.__dict__.items()
    
    >>>[t for t in Test()]
    [('b', 2), ('a', 1)]
    

    【讨论】:

    • 其实我不知道 NDB 是怎么工作的。这适用于普通的 Python,但至于 NDB,我不能说。待我发现。
    • 我找不到。让我知道它是否有帮助。如果没有,对不起。
    【解决方案3】:

    您还可以通过类的__repr____str__ 方法:

    In [7]: class Foo(object):
        def __init__(self):
            self.bar = "A"
            self.baz = "B"
            self.bug = "C"
        def __repr__(self):
            return '\n'.join(['{}={}'.format(k,v) for (k, v) in self.__dict__.items()])
        def __str__(self):
            return '\n'.join(['{}={}'.format(k,v) for (k, v) in self.__dict__.items()])
       ...:     
    
    In [8]: print Foo()
    baz=B
    bar=A
    bug=C
    
    In [9]: Foo()
    Out[9]: 
    baz=B
    bar=A
    bug=C
    

    这是一个 __str__ 方法,可以满足您的需求:

    In [39]: class Foo(object):
        def __init__(self):
            self.bar = "A"
            self.baz = "B"
            self.bug = "C"
        def __repr__(self):
            return '\n'.join(['{}={}'.format(k,v) for (k, v) in self.__dict__.items()])
        def __str__(self):
            return self.__class__.__name__+'('+';'.join(['{}={}'.format(k,v) for (k, v) in self.__dict__.items()])+')'
       ....:     
    
    In [40]: print Foo()
    Foo(baz=B;bar=A;bug=C)
    

    【讨论】:

    • 我将在这里应用的唯一更改是在开头添加类名,并且可能缩进键/值。但是,当然,这取决于具体情况。
    猜你喜欢
    • 1970-01-01
    • 2018-08-27
    • 2017-11-01
    • 2014-08-25
    • 2018-10-26
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多