Python 2.7 GAE递归查询
我有一些代码(如下)正在产生有效的结果,总的来说我很满意。然而,它相当“冗长”,我很想知道这种好/坏的方法——这是否有更有效/更简单的方法,我应该做 我真的很高兴将代码放在模型中而不是api中,所以我希望保持这种方式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
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更改为实例方法,但它可能是您想要的,也可能不是您想要的。