Отношения «один ко многим» в хранилище данных

здесь есть хорошее объяснение отношений "1 ко многим" в хранилище данных, автор Rafe. Каплан. Я попытался адаптировать это к более простому случаю 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: ответ фон Петрушев)

Кажется, это работает:

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: ответ фон Петрушев)

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

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

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

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

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


person Zeynel    schedule 27.11.2010    source источник


Ответы (1)


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

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

РЕДАКТИРОВАТЬ: Что касается вашего редактирования - если ваша цель состоит в том, чтобы сделать объединенный запрос - вы не можете, не с хранилищем данных приложения Google. Однако вы можете захватить пользователя следующим образом:

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

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

person vonPetrushev    schedule 27.11.2010
comment
Спасибо, это работает и печатает: [email protected] club1 [email protected] club22 Я добавил EDIT, потому что не понимаю, как запросить пользователя и получить все его места. - person Zeynel; 27.11.2010