Отношения один-ко-многим в хранилище данных - PullRequest
2 голосов
/ 27 ноября 2010

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

Но я хочу связать "scott@example.com" с местами, куда он ходил; поэтому я хочу напечатать что-то вроде: "scott@example.com: 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: answer by vonPetrushev)

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

query = User.all()
    query.filter("userEmail =", "scott@example.com")
    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)

Отображение:

scott@example.com went to:club1club22

РЕДАКТИРОВАТЬ (re: answer by vonPetrushev)

Я немного растерялся.

Итак, я хочу написать запрос, подобный этому

query = User.all()
query.filter("userEmail =", "scott@example.com")

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

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

1 Ответ

1 голос
/ 27 ноября 2010

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 =", "scott@example.com")
results=query.fetch(1)
scott=results[0]

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

...