我的模特是这样的


俱乐部
用户
课程


提及俱乐部(关键)

届会


参考课程(关键)

俱乐部会员


提及俱乐部(关键)
引用用户(密钥)

课程订阅


课程参考(关键)
引用用户(密钥)



现在,我要订阅所有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
可能像:
select key from courseSubscription, where course.club = {clubid} and user = {user}然后是ndb_get_multi来加载查询结果?
这有可能吗?

最佳答案

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。您将不得不将其过滤掉。

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

10-09 01:57