Как получить доступ к элементам в модели с помощью ReferenceProperty? - PullRequest
1 голос
/ 30 ноября 2010

Это продолжение моего предыдущего вопроса .

Я настроил модели с ReferenceProperty:

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

class Comment(db.Model):
    user = db.ReferenceProperty(User, collection_name="comments")
    comment = db.StringProperty(multiline=True)

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

В хранилище данных у меня есть эта запись в разделе Пользователь:

Entity Kind: User
Entity Key: ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBUM
ID: 21
userEmail: az@example.com

И в разделе Место проведения:

Entity Kind: Venue
Entity Key: ag1oZWxsby0xLXdvcmxkcgsLEgVWZW51ZRhVDA
ID: 85
venue (string): 5 star venue
user (Key): ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBUM
User: id=21

Я пытаюсь отобразить элемент в hw.py следующим образом

query = User.all()
    results = query.fetch(10)
    self.response.out.write("<html><body><ol>")
    for result in results:
        self.response.out.write("<li>")
        self.response.out.write(result.userEmail)
        self.response.out.write(result.venues)
        self.response.out.write("</li>")
    self.response.out.write("</ol></body></html>")

Эта строка работает:

        self.response.out.write(result.userEmail)

Но эта строка не работает:

        self.response.out.write(result.venues)

Но в качестве за ответ фон Петрушева result.venues должен получить venue, связанный с этим userEmail.

Извините, если это сбивает с толку: я просто пытаюсь получить доступ к таблицам, связанным с userEmail с помощью ReferenceProperty.Связанные таблицы: Venue и Comment.Как получить доступ к элементу в Venue или в Comment?Спасибо.

1 Ответ

3 голосов
/ 30 ноября 2010

venues на самом деле является объектом запроса . Так что вам нужно выбрать или перебрать его.

Попробуйте заменить строку self.response.out.write(result.venues) на петлю:

query = User.all()
users = query.fetch(10)
self.response.out.write("<html><body><ol>")
for user in users:
    self.response.out.write("<li>")
    self.response.out.write(user.userEmail)
    self.response.out.write("<ul>")
    # Iterate over the venues
    for venue in user.venues:
        self.response.out.write("<li>%s</li>" % venue.venue)
    self.response.out.write("</ul></li>")
self.response.out.write("</ol></body></html>")

Однако, это не очень хорошо масштабируется. Если будет 10 пользователей, будет запущено 11 запросов! Убедитесь, что вы используете Appstats для поиска подобных проблем с производительностью. Постарайтесь свести к минимуму количество вызовов RPC, которые вы делаете.

Лучшим решением может быть денормализация и хранение электронной почты пользователя по типу места проведения. Таким образом, вам потребуется только один запрос для распечатки информации о месте проведения и электронной почты пользователей.

...