GAE: модель теряет связь родителя-> ребенка - PullRequest
2 голосов
/ 05 июня 2011

У меня возникла странная проблема с отношением Entity в хранилище данных движка приложений Google.Я работаю над веб-приложением Python / GAE (учебное упражнение), полный код которого можно найти в sourceforge .

  • У меня есть 2 модели:
    • Галерея - поисковый запрос и (косвенно) список фотографий
    • Фото - информация о фотографии, плюс галерея, к которой она принадлежит (collection_index = 'photos')
  • У меня есть процесс загрузки, который создает галереи и добавляет к ним фотографии
  • У меня есть страница, которая читает галерею из хранилища данных и использует атрибут ".photos" этого экземпляра Галереи, чтобы получить список фотографий в нем

Теперь вот странная частьin ... Если я изменяю файл (любой файл, на котором я тестировал) или даже просто обновляю метку времени файла (т. е. чтобы он перезагружался) ... запускается атрибут ".photos" галерейне удается. Например, если я пытаюсь загрузить страницу для галереи "flowers" :

Traceback (most recent call last):
  File "C:\Applications\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 700, in __call__ handler.get(*groups)
  File "C:\Eclipse-Workspace\galleries-google\app\views\gallery.py", line 33, in get for photo in gallery.photos:
AttributeError: 'Gallery' object has no attribute 'photos'

Я могу перезапустить веб-приложение, я могу перезапустить панель запуска приложения изатем запустите веб-приложение.Проблема сохраняется независимо от этого.Кажется, мне нужно заставить хранилище данных «запомнить» соединение каким-то образом

# Reading the list of photos for a given gallery via the Photo entity
# This seems to force the datastore to "remember" the connection between the two
from google.appengine.ext import db
import pprint
from app.models.gallery import Gallery
from app.models.photo import Photo

gallery = Gallery.get_by_key_name('candy')
print("Gallery: " + gallery.search_term)
q = db.GqlQuery("SELECT * FROM Photo WHERE gallery = :1", gallery )
photos = q.fetch(20)

for photo in photos :
    print("\tphoto: " + photo.getUrl('original'))

или путем повторного приема всех данных с нуля (хотя я полагаю, что даже повторное использование одной галереи будет делать).

Есть ли у кого-нибудь мысли о том, что может быть причиной этого? Буду признателен за любую помощь.

Примечания:

  • Это в среде разработчиков.Я еще не дошел до того, что стоит зарегистрировать его как веб-приложение на реальных серверах.
  • Как ни странно, я недавно задал вопрос о том, как Как перечислить дочерние узлы в родительском в GAE ... так как я действительно хотел, чтобы информация существовала в определении родительской модели.Иронично, что это (по-видимому) отсутствие этой информации у родителя, которая сейчас вызывает проблему

1 Ответ

2 голосов
/ 06 июня 2011

Итак, после долгих размышлений, я считаю, что нашел ответ ...

  • Когда файл изменяется (изменяется временная метка), механизм приложения делает недействительными скомпилированные / кэшированные файлы, которые у него есть
  • Когда класс Photo определен, он добавляет свойство к классу Gallery<code> based on the collection of ids it has for them</li> <li>When it needs the <code>Gallery, механизм приложения перезагружает код для него ... потому что его определение было недействительным при изменении файла
  • Поскольку он не знает, что ему нужен класс Photo, он не загружает этот файл, поэтому «новый экземпляр» класса Gallery не имеет свойства, которое следует создать для его коллекции.

Моим первым решением было добавить зависимость от файла Photo в файл Gallery.

from app.models.photo import Photo
</code>

Проблема в этом заключается в том, что она создает круговую зависимость между двумя файлами (поскольку Photo уже должен знать о приложении Gallery, чтобы иметь их список).Хотя это работало, мне сказали, что у Python есть «проблемы» с циклическими зависимостями, и это, вероятно, не очень хорошая вещь;позже он может укусить меня.

Решение, с которым я столкнулся, заключалось в том, чтобы файл __init.py для рассматриваемого пакета включал зависимость для обоих файлов.Таким образом, каждый раз, когда потребуется один из файлов, оба будут загружены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...