我的模特是这样的
俱乐部
用户
课程
提及俱乐部(关键)
届会
参考课程(关键)
俱乐部会员
提及俱乐部(关键)
引用用户(密钥)
课程订阅
课程参考(关键)
引用用户(密钥)
现在,我要订阅所有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我使用了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/