Python NDB,跨多个模型查询。阿彭金

Python NDB,跨多个模型查询。阿彭金,python,google-app-engine,python-2.7,google-cloud-datastore,app-engine-ndb,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) ... 我想得到用户登录行的列表 我想做的是: qry = LogOnline

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

class User(ndb.Model):
    ...

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

class LogOnline(ndb.Model)
    logVisit = ndb.KeyProperty(kind = LogVisit)
    ...
我想得到用户登录行的列表

我想做的是:

qry = LogOnline.query(LogOnline.logvisit.get().user.get() == user)
然而,appengine不允许我在查询中使用get方法

你有什么想法吗?
非常感谢。

你做错了

# 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()

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

那就

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

如果您想在appengine上拥有可伸缩的应用程序,就必须停止使用SQL。从纯实体关系的角度考虑,不要试图规范化数据模型。像LogVisit这样的中间实体通常只在您需要多对多关系时使用,但如果您有多个特定关系的实例,则仍然效率低下。

谢谢。这是实现这一目标的最简单方法吗?我本以为我可以用一个查询完成整个操作?在一个每个用户都有大量日志访问的系统中,这可能会变得非常低效。你正试图用关系数据库设计你的应用程序。Google NDB数据存储更像是一个noSql数据库。上面提供的代码会产生语法错误。我还尝试了logOnlinesA=LogOnline.query().filter(logvisions中的LogOnline.logVisit).fetch(),但这会产生“TypeError:无法筛选非节点参数;”logOnlinesA=LogOnline.query().filter(LogOnline.logVisit.in(*logvists)).fetch()谢谢。如您所见,我来自关系数据库背景。在其中,我试图通过规范化所有内容来阻止数据重复。将用户当前的登录线密钥存储在用户实体中也是一个想法吗?或者从代码复制的角度来看,这被认为是糟糕的设计?每次创建新的登录线时,都必须更新用户实体。但是,它允许进行更简单的查询,以找出用户当前使用的登录行。你认为呢?不,如果必须写入用户实体,那么效率会非常低。只需将用户密钥存储在登录行中,即可提供所需的查询。你应该尽量减少写操作。它们很贵。