Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 GAE递归查询_Python 2.7_Google App Engine_Google Cloud Datastore_App Engine Ndb - Fatal编程技术网

Python 2.7 GAE递归查询

Python 2.7 GAE递归查询,python-2.7,google-app-engine,google-cloud-datastore,app-engine-ndb,Python 2.7,Google App Engine,Google Cloud Datastore,App Engine Ndb,我有一些代码(如下)正在产生有效的结果,总的来说我很满意。然而,它相当“冗长”,我很想知道这种好/坏的方法——这是否有更有效/更简单的方法,我应该做 我真的很高兴将代码放在模型中而不是api中,所以我希望保持这种方式 class ndb_Project(ndb.Model): name = ndb.StringProperty() description = ndb.StringProperty() version = ndb.StructuredProperty(ndb

我有一些代码(如下)正在产生有效的结果,总的来说我很满意。然而,它相当“冗长”,我很想知道这种好/坏的方法——这是否有更有效/更简单的方法,我应该做

我真的很高兴将代码放在模型中而不是api中,所以我希望保持这种方式

class ndb_Project(ndb.Model):
    name = ndb.StringProperty()
    description = ndb.StringProperty()
    version = ndb.StructuredProperty(ndb_Version)
    parentProj = ndb.KeyProperty()
    childProj = ndb.KeyProperty(repeated=True)

    @classmethod
    def getChildProjects(cls,key):
        proj = key.get()
        a = []
        for c in proj.childProj:
            a.append(proj.getChildProjects(c))
        o = proj.to_dict()
        o['urlSafe'] = proj.key
        o['childProj'] = a
        return o
非常感谢 托比


另一种选择

@classmethod
    def getChildProjects(cls, proj):
        o = proj.to_dict()
        o['urlSafe'] = proj.key
        temp = []
        a = ndb.get_multi(proj.childProj) if proj.childProj else []
        for c in a:
             temp.append(proj.getChildProjects(c))
        o['childProj']
        return o

像这样的东西应该可以使用。它还将更快,因为它在单个rpc中获取多个键,而不是像当前循环那样连续获取

编辑我在
/\u ah/stats/shell
中运行了它,因此我知道只要它返回您想要的输出,它就可以工作

from google.appengine.ext import ndb
from pprint import pprint as pp


class ndb_Project(ndb.Model):
    name = ndb.StringProperty()
    description = ndb.StringProperty()
    parentProj = ndb.KeyProperty()
    childProj = ndb.KeyProperty(repeated=True)

    def getChildProjects(self):
        a = [ent.getChildProjects() for ent in ndb.get_multi(self.childProj)]
        o = self.to_dict()
        o['urlSafe'] = self.key
        o['childProj'] = a
        return o

p = ndb_Project(name='first', description='first entity')
p.put()

for x in xrange(5):
    tmp = ndb_Project(name=str(x), description='desc %s' % x)
    p.childProj.append(tmp.put())
    for y in xrange(5):
        tmp2 = ndb_Project(name='%s %s' % (x, y), description='desc %s %s' % (x, y))
        tmp.childProj.append(tmp2.put())
    tmp.put()
p.put()

pp(p.getChildProjects())
输出

{'childProj': [{'childProj': [{'childProj': [],
                               'description': u'desc 0 0',
                               'name': u'0 0',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5251250308251648)},
                              {'childProj': [],
                               'description': u'desc 0 1',
                               'name': u'0 1',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5245618633048064)},
                              {'childProj': [],
                               'description': u'desc 0 2',
                               'name': u'0 2',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5793979555643392)},
                              {'childProj': [],
                               'description': u'desc 0 3',
                               'name': u'0 3',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 6371518539890688)},
                              {'childProj': [],
                               'description': u'desc 0 4',
                               'name': u'0 4',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5208529711398912)}],
                'description': u'desc 0',
                'name': u'0',
                'parentProj': None,
                'urlSafe': Key('ndb_Project', 6460121467060224)},
               {'childProj': [{'childProj': [],
                               'description': u'desc 1 0',
                               'name': u'1 0',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 6334429618241536)},
                              {'childProj': [],
                               'description': u'desc 1 1',
                               'name': u'1 1',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 6344957925261312)},
                              {'childProj': [],
                               'description': u'desc 1 2',
                               'name': u'1 2',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 6448551898906624)},
                              {'childProj': [],
                               'description': u'desc 1 3',
                               'name': u'1 3',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5286432096649216)},
                              {'childProj': [],
                               'description': u'desc 1 4',
                               'name': u'1 4',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5808107145920512)}],
                'description': u'desc 1',
                'name': u'1',
                'parentProj': None,
                'urlSafe': Key('ndb_Project', 5282008817205248)},
               {'childProj': [{'childProj': [],
                               'description': u'desc 2 0',
                               'name': u'2 0',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5808889098403840)},
                              {'childProj': [],
                               'description': u'desc 2 1',
                               'name': u'2 1',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5035775120900096)},
                              {'childProj': [],
                               'description': u'desc 2 2',
                               'name': u'2 2',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5881052870475776)},
                              {'childProj': [],
                               'description': u'desc 2 3',
                               'name': u'2 3',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5850614068150272)},
                              {'childProj': [],
                               'description': u'desc 2 4',
                               'name': u'2 4',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5215350924771328)}],
                'description': u'desc 2',
                'name': u'2',
                'parentProj': None,
                'urlSafe': Key('ndb_Project', 5811114428334080)},
               {'childProj': [{'childProj': [],
                               'description': u'desc 3 0',
                               'name': u'3 0',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 6368218830602240)},
                              {'childProj': [],
                               'description': u'desc 3 1',
                               'name': u'3 1',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5287664114728960)},
                              {'childProj': [],
                               'description': u'desc 3 2',
                               'name': u'3 2',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5041177015353344)},
                              {'childProj': [],
                               'description': u'desc 3 3',
                               'name': u'3 3',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 6412332003491840)},
                              {'childProj': [],
                               'description': u'desc 3 4',
                               'name': u'3 4',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5231029602222080)}],
                'description': u'desc 3',
                'name': u'3',
                'parentProj': None,
                'urlSafe': Key('ndb_Project', 5245939144982528)},
               {'childProj': [{'childProj': [],
                               'description': u'desc 4 0',
                               'name': u'4 0',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 4964143656337408)},
                              {'childProj': [],
                               'description': u'desc 4 1',
                               'name': u'4 1',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 4927054734688256)},
                              {'childProj': [],
                               'description': u'desc 4 2',
                               'name': u'4 2',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 6348349238149120)},
                              {'childProj': [],
                               'description': u'desc 4 3',
                               'name': u'4 3',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 5004957119938560)},
                              {'childProj': [],
                               'description': u'desc 4 4',
                               'name': u'4 4',
                               'parentProj': None,
                               'urlSafe': Key('ndb_Project', 4960843947048960)}],
                'description': u'desc 4',
                'name': u'4',
                'parentProj': None,
                'urlSafe': Key('ndb_Project', 5250989925859328)}],
 'description': u'first entity',
 'name': u'first',
 'parentProj': None,
 'urlSafe': Key('ndb_Project', 5208229332123648)}
原始代码,以便对该答案的原始注释有意义

class ndb_Project(ndb.Model):
    name = ndb.StringProperty()
    description = ndb.StringProperty()
    version = ndb.StructuredProperty(ndb_Version)
    parentProj = ndb.KeyProperty()
    childProj = ndb.KeyProperty(repeated=True)

    @classmethod
    def getChildProjects(cls, key):
        proj = key.get()
        a = ndb.get_multi(proj.childProj) if proj.childProj else []
        o = proj.to_dict()
        o['urlSafe'] = proj.key
        o['childProj'] = a
        return o

当然,最好不要递归地查询任何内容,因为它需要大量单独的查询。如果您对数据进行非规范化,并向所有实体添加一个公共索引字段(或祖先),您可以通过该字段进行查询,从而使查询非递归且速度更快。当然,在某些实体结构中,这种方法是不可行的;如果您不知道此方法会加快速度,请将此评论视为一个提示。我相信这缺少了我第一个查询的递归元素?很好,我错过了这一部分。
key.get()
的线性查询将真正影响查询的性能,因此我试图重构它。让我考虑一下,我想getChildProjects函数可以把ndb_项目对象作为参数?我将发布一个答案,因为注释中的代码标记是有限的。对于本例,我将getChildProjects更改为实例方法,但它可能是您想要的,也可能不是您想要的。