【发布时间】:2015-11-12 21:35:41
【问题描述】:
随着时间的推移,组建的团队可能会部署到多个项目
在此示例中,我只想查询分配给“活动”项目的团队。我正在使用的代码正在运行,但我想知道是否有更有效/更紧凑的方法。
模型
class Team(ndb.Model):
"""Model for representing an project team."""
teamid = ndb.StringProperty(required=True)
project = ndb.KeyProperty(kind='Project', required=True, repeating=True)
class Project(ndb.Model):
"""Model for representing a Project"""
name = ndb.StringProperty(required=True)
status = ndb.StringProperty(required=True)
查询
status = 'active'
project_query = Project.query()\
.filter(Project.status == status)
active_projects = project_query.fetch(1000, keys_only=True)
team_query = Team.query().order(Team.teamid)\
.filter(Team.projectid.IN(active_projects))
results = team_query.fetch(max_results, offset=start_at)
紧凑的形式(本质上是一样的)
team_query = Team.query().order(Team.teamid)\
.filter(Team.projectid.IN(Project.query().filter(Project.status == status)
.fetch(1000, keys_only=True)))
有没有更好的办法?
【问题讨论】:
-
检查appstats 将是您确定的最佳方式。您绝对应该对活动项目执行
keys_only=查询,然后在查询Team时使用这些键。 -
这就是我已经在做的事情。紧凑的形式与比较没有任何不同 - 我想知道是否有一种根本不同的方式来处理它
-
不,考虑到您帖子中的上下文,您的方式是最有效的。
-
另一种方法是存储团队的密钥,同时与项目相关。然后查询活动项目,然后你就有了团队..
-
是的。您需要从效率的角度考虑您需要什么。在某些情况下,链接实体(存储团队和项目的密钥以及您需要的任何摘要数据)可能更有效。除非您需要向下钻取,否则不需要映射。第一个视图的所有结果都将在一个查询中。
标签: python google-app-engine google-cloud-datastore app-engine-ndb