NDB中M到M的结构化查询

时间:2015-01-12 16:31:29

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

我的模特就像这样

  • 俱乐部
  • 用户
    • 参考俱乐部(关键)
  • 会话
    • 参考课程(关键)
  • ClubMembership
    • 参考俱乐部(关键)
    • 对用户(密钥)的引用
  • CourseSubscription
    • 参考课程(关键)
    • 对用户(密钥)的引用

现在,我想让我订阅的所有course个订阅,输入clubuser

我所做的是:

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

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

有更好的方法吗?至少便宜一点。我在考虑使用gql,但是我有一个IN的列表。 可能像smt一样: select key from courseSubscription, where course.club = {clubid} and user = {user}然后ndb_get_multi加载查询结果? 这有可能吗?

1 个答案:

答案 0 :(得分:1)

for循环会发出大量请求,您可以将它们合并为一个请求。

如果您的CourseSubscription与上述SO链接中的CourseInscription相同,那么您可以获得订阅密钥列表并进行一次get_multi()调用以获取所有订阅密钥订阅:

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

如果该密钥不存在,则该订阅将为None。你必须过滤掉那些。