2010-07-14 2 views
1

У меня есть модели в разных файлах (блог/models.py, forum/models.py, article/models.py). В каждом из этих файлов я определил классы моделей с префиксом приложения (BlobPost, BlogTag, ForumPost, ForumThread, Article, ArticleCategory).Как предварительно загрузить модель для ReferenceProperty?

Также у меня есть приложение - комментарий, для добавления комментариев к любому объекту модели. Например, я хочу прокомментировать BlogPost или добавить комментарий, ссылающийся на ForumPost. Для этого я использую свойство с типом ReferenceProperty() - без указания типа ссылок. Любая модель может быть прикреплена к комментарию.

В чем проблема? Если у меня есть все комментарии в разделе администрирования, я вижу проблему с автозагрузкой моделей для ReferenceProperty. Я не знаю, какой тип модели использовался для текущего комментария. Мне нужна автозагрузка пакета с моделью, если это необходимо.

Да, существует простое решение - включает все модели из всех приложений. Но это нехорошее решение. Мне нужны только модные модели. Как сделать эту автозагрузку?

Моя идея основана на обнаружении вида собственности, и по первой части этого имени определите имя приложения для загрузки всех моделей в этом приложении. Например, у меня есть комментарий с ссылкой на модель BlogPost. Я получаю название приложения - блог и загружаю все модели из импорта блога.models *

Для реализации моей идеи мне нужно понять - как перехватить создание экземпляров свойств. В моем случае, если я перебираю комментарии, я вижу, что App Engine автоматически (спасибо, но не в моем случае) создает экземпляры для свойств.

Как ввести мою логику для загрузки моих моделей перед созданием экземпляра свойства?

Спасибо!

ответ

1

Это невозможно в стандартной структуре db, так как информации для поиска недостаточно. Единственная информация, с которой должна работать инфраструктура, - это имя вида, которое не включает полностью квалифицированный пакет, поэтому у него нет способа выяснить, в каком пакете может быть ваше определение модели.

Если вы пишете интерфейс администратора, однако, вероятно, вы, скорее всего, захотите использовать интерфейс низкого уровня google.appengine.api.datastore, который работает на dicts вместо классов модели и не требует определения модели.

+0

Спасибо, Ник! Я нашел решение. Я загружаю все модели в первый запрос и кеширую это значение для всех следующих запросов. Это помогает мне экономить время для загрузки всех моделей, а также загружать все модели в память. Например, мои модели имеют уникальный префикс с именем модели (BlogPost, ForumComment и т. Д.) - у нас нет проблем с равными именами моделей. Проблема была решена мной в среде AppEngine. Благодарим за помощь! – 2010-08-03 19:18:32

Смежные вопросы