python - NDB 中 M 到 M 的结构化查询

标签 python google-cloud-datastore app-engine-ndb gql

我的模型是这样的

  • 俱乐部
  • 用户
  • 类(class)
    • 引用俱乐部( key )
  • session
    • 引用类(class)(重点)
  • 俱乐部成员(member)资格
    • 引用俱乐部( key )
    • 对用户( key )的引用
  • 类(class)订阅
    • 引用类(class)(重点)
    • 对用户( key )的引用

现在,我想要拥有我订阅的所有类(class),并输入一个俱乐部和一个用户

我所做的是:

courses = Courses(Courses.club == club.key).fetch(keys_only=True)
real_list = []
for course in courses:
   if CourseSubscription.get_by_id(user, course):
       real_list.append(course)
sessions = Session.query(Session.course.IN(real_list),Session.start_date >= start_date).fetch()

对于类(class)订阅,我使用了这个 https://stackoverflow.com/a/26746542/1257185 ,这就是为什么我可以做 if (但它很昂贵)

有更好的方法吗?至少便宜一些。我正在考虑 gql,但后来我有一个 IN 列表要做。 可能smt喜欢: 从 courseSubscription 中选择 key ,其中 course.club = {clubid} 和 user = {user} 然后使用 ndb_get_multi 加载查询结果? 这有可能吗?

最佳答案

for 循环会发出多个请求,您可以将它们组合成一个请求。

如果您的 CourseSubscription 与上面 SO 链接中的 CourseInscription 相同,那么您可以获取订阅 key 列表并创建一个 get_multi( ) 调用以获取所有订阅:

subscription_keys = [ndb.Key(CourseSubscription, CourseSubscription.build_id(user, course))
                     for course in courses]
real_list = ndb.get_multi(subscription_keys)

如果 key 不存在,则该订阅将为None。您必须将其过滤掉。

关于python - NDB 中 M 到 M 的结构化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27906581/

相关文章:

python - 为什么 Google App Engine NDB 数据存储区同时具有 "—"和 "null"未知数据?

python - "Player2"无法执行与 "player"相同的操作

python - Pandas 通过其他列的数量来填充列

python - 如何为具有相同结构的方法创建泛型方法?

python - 使用 ruamel.yaml 时如何防止重新格式化 yaml 文件?

python - 如何删除 App Engine 中的自动索引?

python - 使用 NDB 中的 Key 检索实体

jpa - 如何通过 JDO、JPA 或 Objectify 访问 Google Cloud Datastore?

google-app-engine - 删除 GAE 数据存储中的所有数据

python - 多个查询与手动排序一个大型查询 (AppEngine NDB)