NDB,查询多个模型。 AppEngine上

时间:2014-01-09 17:06:16

标签: python google-app-engine python-2.7 google-cloud-datastore app-engine-ndb

我正在努力查询多个模型。 这就是我的类结构:

class User(ndb.Model):
    ...

class LogVisit(ndb.Model)
    user = ndb.KeyProperty(kind=User)
    ...

class LogOnline(ndb.Model)
    logVisit = ndb.KeyProperty(kind = LogVisit)
    ...

我希望获得用户LogOnline的列表

我想做的是:

qry = LogOnline.query(LogOnline.logvisit.get().user.get() == user)

然而,app引擎不允许我在查询中使用get方法。

关于最佳方式的任何想法? 非常感谢。

2 个答案:

答案 0 :(得分:1)

最有效的方法是将用户密钥存储在LogOnline实体中。我们无法看到模型的其余部分,看看LogVisit为整个练习添加了什么,因此很难看出LogVisit作为中间实体为设计带来了什么。

然后只是

 LogOnline.query().filter(LogOnline.user == user)

如果你想在appengine上安装可扩展的应用程序,你将不得不停止思考SQL。考虑纯实体关系,不要尝试规范化数据模型。像LogVisit这样的中间实体往往只在需要多对多关系时使用,但如果对于特定关系有多个实例,则效率仍然低效。

答案 1 :(得分:0)

你做错了。

# user variable is assumed to be a key
logonlines = [] # You can use set also
logvisits = LogVisit.query().filter(LogVisit.user == user).fetch()
for logvisit in logvisits:
    logOnlinesA = LogOnline.query().filter(LogOnline.logVisit == logvisit.key).fetch()
    logonlines.extend(logOnlinesA)

试一试:

logvisits = LogVisit.query().filter(LogVisit.user == user).fetch(keys_only=True)
logOnlinesA = LogOnline.query().filter(LogOnline.logVisit.in(logvisits)).fetch()