Ленивая загрузка больших / сложных свойств модели в Google App Engine - PullRequest
0 голосов
/ 19 ноября 2011

Допустим, я моделирую веб-сайт, где веб-страница будет представлена ​​PageModel, например:

class PageModel(db.Model):
    name = db.StringProperty()
    parentPage = db.SelfReferenceProperty()
    content = db.TextProperty()

Я хотел бы иметь возможность получить список всех объектов моей страницы для отображения меню и т. Д., Но без необходимости извлекать содержимое для всех элементов. Как бы вы смоделировали этот объект так, чтобы вы могли извлекать контент только тогда, когда он вам нужен? Требуется ли ссылочное отношение 1-к-1 с отдельной моделью «контента»? И если да, сделаете ли вы ссылку на объект page или на объект content?

1 Ответ

2 голосов
/ 19 ноября 2011

Вы можете переместить свойство содержимого в новую модель (PageContentModel).Я бы реализовал ссылку, имея родительский элемент PageContentModel быть PageModel (используя родительское свойство db.Model).Это позволяет вам изменять их обоих в одной транзакции (так как они находятся в одной группе сущностей).

Одно преимущество моделирования вещей с использованием PageContentModel, имеющей ссылку на PageModel (в отличие от PageModel, имеющейссылка на PageContentModel) заключается в том, что если вам когда-либо понадобится контент размером более 1 МБ, вы можете сделать это, разрешив каждому PageModel иметь 1 или более объектов PageContentModel, и вы просто разделите свой контент на куски по 1 МБ и запишите каждый кусок в другойЭкземпляр PageContentModel.Чтобы иметь возможность вернуть содержимое, вам необходимо, чтобы объекты PageContentModel имели свойство «порядок», связанное с ними, чтобы можно было перестроить содержимое в правильном порядке.

Для запроса связанных экземпляров PageContentModelдля PageModel вы бы использовали фильтр предков, например:

PageContentModel.all().ancestor(page_model_instance)

. Как предлагает @Nick, другой способ сделать это - использовать files api для записи содержимого вBLOB-объект в хранилище BLOB-объектов, а затем связать этот BLOB-объект с PageModel, указав свойство BlobReferenceProperty в PageModel.Теперь у меня была возможность попробовать это, и это работает довольно хорошо (несмотря на то, что это экспериментальная функция).Это позволило бы вашему контенту быть очень большим и, в соответствии с новой моделью ценообразования, на самом деле дешевле, чем хранение вашего контента в модели хранилища данных.

Обновлено 7 февраля 2012 г. , чтобы включить предложение от@ Ник о магазине.

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