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

2024-03-29 09:40:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试学习/使用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)

我所要做的是找到一种简单的方法,通过一个单一的函数来交互存储在任何实体中的所有数据,而不考虑实体的名称,或实体内属性的名称或数量。在


我有两个问题;这样做:

^{pr2}$

我得到一个错误:

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文档或其他地方找到任何东西。在


Tags: name实体名称trueagemodel错误required
3条回答

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

@ChrisC73,我不能让你的代码正常工作,但是通过借用一些代码,我想出了这个方法,它确实有效,尽管它看起来非常困难(而且计算量很大),做一些应该容易得多的事情。在

# 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,您可以轻松返回实体属性的名称:

^{pr2}$

但是它按字母顺序返回它们,这意味着您不能(似乎)依赖属性的返回顺序作为显示顺序。在

像这样的方法应该可以做到:

    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

相关问题 更多 >