迭代* any * GAE实体中的数据?

时间:2015-10-12 17:59:27

标签: python google-app-engine

我正在尝试学习/使用GAE ndb,并且正在努力解决应该简单的事情。

假设我有几种类型的实体:

class Cat(ndb.Model):
    name = ndb.StringProperty(required = True)
    age = ndb.IntegerProperty(required = True)
    vicious = ndb.BooleanProperty(required = True)

class Dog(ndb.Model):
    name = ndb.StringProperty(required = True)
    age = ndb.IntegerProperty(required = True)
    willfetch = ndb.BooleanProperty(required = True)
    canswim = ndb.BooleanProperty(required = True)

我尝试做的是找到一种简单的方法来处理存储在任何实体中的所有数据,只需一个函数,无论实体的名称如何,或者实体内的属性名称或数量。

我有两个问题;这样做:

f = "<<Entity name>>"
qry = f.query()

我收到错误:

AttributeError: 'module' object has no attribute 'b'

这阻止我以编程方式访问实体(例如,从名称列表中)。

然后,即使我通过名称引用实体来修复此错误,我也无法完全回顾所返回的内容:

qry = Cat.query()

for item in qry:
    for property in item:
        **display data**

...给出错误:

TypeError: '<<name>>' object is not iterable

有什么想法?我在GAE文档或其他地方找不到任何内容。

3 个答案:

答案 0 :(得分:1)

ndb.Model._kind_map['ModelName']将返回类的名称(这通常是与模型类相同的字符串)。 给定一个实体类,Entity._properties将返回它的属性列表。

答案 1 :(得分:0)

这样的事情可以解决问题:

    from importlib import import_module

    module = import_module('api.models.datastore') # Your model module
    model = getattr(module, '<<Entity name>>')
    results = model.all() # or query()
    for result in results:
        members = inspect.getmembers(result, lambda a:not(inspect.isroutine(a)))
        members = [m for m in members if not m[0].startswith('_')]
        print # space for demo purposes
        for key, value in members:
            print "{} - {}".format(key, value) # or whatever you want

答案 2 :(得分:0)

@ ChrisC73,我无法让你的代码正常工作,但是通过借用一些内容,想出了这个,这确实有效,尽管做应该的事情似乎非常困难(并且计算量很大) em>要容易得多。

# the names of each property in the Cat entity, *in desired display order*
Cat_property_titles = ['name', 'age', 'vicious']

qry = Cat.query()

for entry in qry:
   members = inspect.getmembers(entry, lambda a:not(inspect.isroutine(a)))
   members = [m for m in members if not m[0].startswith('_')]
   for title in Cat_property_titles:
      for item in members:
         if item[0] == title:
            <<output item[0]>>

FWIW,您可以轻松返回实体属性的名称:

qry = Cat.query()
props = Cat._properties   # returns a dictionary

... 它会按字母顺序返回它们,这意味着您无法(似乎)依赖返回的属性顺序作为显示顺序。