2

Существует хорошее объяснение отношений «один ко многим» в хранилище данных here от Rafe Kaplan. Я попытался адаптировать это к более простому случаю User и Venue. Таким образом, пользователь может пойти во многие рестораны; и я хочу, чтобы распечатать электронную почту пользователя и рестораны пользователя пошел:Отношения «один ко многим» в хранилище данных

class User(db.Model): 
    userEmail = db.StringProperty() 

class Venue(db.Model): 
    user = db.ReferenceProperty(User, 
            collection_name="venues") 
    venue = db.StringProperty() 

class OneToMany(webapp.RequestHandler): 
    def get(self): 
     scott = User(userEmail="[email protected]") 
     scott.put() 
     Venue(user=scott, 
        venue="club1").put() 
     Venue(user=scott, 
        venue="club2").put() 

     for v in scott.venues: 
      self.response.out.write(v.venue) 

Печатается "club1 club2"

Но я хочу, чтобы связать "[email protected]" с местом, он пошел к; поэтому я хочу, чтобы напечатать что-то вроде: "[email protected]: club1, club2"

Попытка

for v in scott.venues: 
    self.response.out.write(userEmail) 
    self.response.out.write(v.venue) 

выдает ошибку:

self.response.out.write(userEmail) 
NameError: global name 'userEmail' is not defined 

Что такое правильный способ сделать это? Благодаря!

EDIT2 (Re: ответ на vonPetrushev)

Это похоже на работу:

query = User.all() 
    query.filter("userEmail =", "[email protected]") 
    results=query.fetch(1) 
    scott=results[0] 
    self.response.out.write("%s went to:" % scott.userEmail) 
    for venue in scott.venues: 
     self.response.out.write(venue.venue) 

Дисплеи:

[email protected] went to:club1club22

EDIT (Re: ответ на vonPetrushev)

Я немного смущен.

Так что я хочу написать запрос, как этот

query = User.all() 
query.filter("userEmail =", "[email protected]") 

и отобразить все места, связанные с этим пользователем.

Непонятно, как связаны User и Venue.

ответ

1

userEmail не является определенным именем в области цикла for. Что вам нужно:

for v in scott.venues: 
    self.response.out.write(scott.userEmail) 
    self.response.out.write(v.venue) 

EDIT: Что касается вашего редактирования - если ваша цель состоит в том, чтобы сделать запрос присоединились - вы не можете, а не с приложением датастором Google. Тем не менее, вы можете захватить пользователя, как это:

query = User.all() 
query.filter("userEmail =", "[email protected]") 
results=query.fetch(1) 
scott=results[0] 

, а затем получить места, как scott.venues. Отношение определено в строке с db.ReferenceProperty, которая определяет, что такое someuser.venues и что такое somevenue.user.

+0

Спасибо, что работает и печатает: `[email protected] club1 [email protected] club22` Я добавил «EDIT», потому что я не понимаю, как запросить пользователя и получить все его места. – Zeynel 2010-11-27 18:51:16

Смежные вопросы