在NDB中对M到M进行结构化查询

2024-05-16 09:47:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我的模特是这样的

  • 俱乐部
  • 用户
  • 课程
    • 俱乐部参考号(键)
  • 会话
    • 课程参考(关键)
  • 俱乐部会员
    • 俱乐部参考号(键)
    • 引用用户(键)
  • 课程订阅
    • 课程参考(关键)
    • 引用用户(键)

现在,我想要订阅所有的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()

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

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


Tags: key用户ifsessionfetchreallist关键
1条回答
网友
1楼 · 发布于 2024-05-16 09:47:57

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。你得把这些过滤掉

相关问题 更多 >