NDB 中 M 到 M 的结构化查询

Structured query over M to M in NDB

我的模型是这样的

现在,我想拥有我订阅的所有 course,输入一个 club 和一个 user

我所做的是:

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,我使用了这个 ,这就是为什么我可以做 if(但它很贵)

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

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

如果您的 CourseSubscription 与上述 SO link 中的 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。你将不得不过滤掉那些。