我的模型是这样的
- 俱乐部
- 用户
- 类(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/