我正在努力查询多个模型。 这就是我的类结构:
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方法。
关于最佳方式的任何想法? 非常感谢。
答案 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()