1

Это продолжение на my previous question.Как получить доступ к элементам в модели с помощью ReferenceProperty?

Я создал модели с 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: [email protected] 

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

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) 

Но, как per vonPetrushev's answerresult.venues должен захватить venue, связанный с этим userEmail.

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

ответ

3

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

Попробуйте заменить 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, которые вы совершаете.

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

+0

Спасибо за ваш ответ. Учитывая упомянутые выше проблемы производительности, я решил добавить свойство `lastVenue` к` User`, и теперь я показываю его как `result.latestVenue`. Но я также сохраняю его в разделе «Место проведения» как «ReferenceProperty» для последующего использования. Я предполагаю, что это лучше. В очередной раз благодарим за помощь. – Zeynel 2010-11-30 21:47:52