2015-01-12 2 views
1

Моя модель, как этоСтруктурированные запрос по М к М в ОПРС

  • Club
  • Пользователь
  • курс
    • ссылка на клуб (ключ)
  • Session
    • ссылка на курс (ключ)
  • ClubMembership
    • ссылка на клуб (ключ)
    • ссылки на (ключ)
  • CourseSubscription
    • ссылки на курс пользователя (ключ)
    • ссылка на пользователя (ключ)

Теперь я хочу, чтобы все course S я подписался, имея в качестве входных 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. вероятно smt like: select key from courseSubscription, where course.club = {clubid} and user = {user}, а затем ndb_get_multi чтобы загрузить результаты запроса? это возможно как-то?

+1

GQL не предоставляет * никакой * дополнительной функциональности или эффективности по сравнению с db/ndb. –

+0

, так есть ли лучшее решение (в NDB), чем тот, который я сделал? – EsseTi

ответ

1

Цикл for делает несколько запросов, и вы можете объединить их в один запрос.

Если CourseSubscription таких же, как CourseInscription в вашой SO ссылки выше, то вы можете получить список ключей подписки и сделать один get_multi() вызова, чтобы получить все подписки:

subscription_keys = [ndb.Key(CourseSubscription, CourseSubscription.build_id(user, course)) 
        for course in courses] 
real_list = ndb.get_multi(subscription_keys) 

Если ключа не существует, то эта подписка будет None. Вам придется отфильтровать их.

+0

не пробовал, но кажется очень хорошим. 'None' будет в' real_list', правильно? если да, то какой лучший способ удалить «Нет» из списка? я думаю, наверное, это http://stackoverflow.com/a/16096769/1257185 – EsseTi

+0

Да, это, наверное, лучший способ: 'real_list = [s для s в ndb.get_multi (subscription_keys), если s не None]' –