Я пытаюсь изучить NDB Google App Engine и не понимаю структуру моделей.
Моя ситуация похожа на платформу CMS с типами сообщений (как в WordPress), поэтому у меня есть «Блоги» и «Страницы». Для всех этих типов сообщений требуется одинаковый набор атрибутов: родительский элемент, имя, ярлык, шаблон, содержимое, статус и дата.
До сих пор я понимаю, что мне нужно создать модель для них следующим образом:
class Post(ndb.Expando):
parent = ndb.StringProperty()
name = ndb.StringProperty()
slug = ndb.StringProperty()
template = ndb.StringProperty()
content = ndb.StringProperty(indexed=False)
status = ndb.StringProperty()
date = ndb.DateTimeProperty(auto_now_add=True)
(Я использую Expando, потому что буду добавлять «неизвестные» атрибуты в свое приложение)
Но с такой структурой все мои сообщения (в каждом типе сообщений) будут относиться к одному и тому же «типу», поэтому запросы будут занимать больше времени (если я не ошибаюсь).
- Как я могу создать много моделей (видов) с одинаковыми атрибутами?
- Нужно ли копировать и вставлять приведенную выше модель под разными именами классов?
- Можно ли динамически создавать новые модели (аналогично «Пользовательским типам записей» в WordPress)? Будет ли это работать, если я использую
ndb.Key('Blog', blogid)
вместо объявления модели? - Создаю ли я модель под названием
class PostType(ndb.Model)
, которая хранит «Типы сообщений» и дает им предков сообщений? (Если я не ошибаюсь, это вызовет проблемы, потому что обновление сообщения «заблокирует» все дерево предков на секунду или около того)
Моя основная цель — эффективность. Спасибо!
Обновления:
Как написали Дэн и Мгилсон, добавление подклассов основного класса Post Model — хороший способ решить эту проблему:
class Post(ndb.Expando):
parent = ndb.StringProperty()
name = ndb.StringProperty()
slug = ndb.StringProperty()
template = ndb.StringProperty()
content = ndb.StringProperty(indexed=False)
status = ndb.StringProperty()
date = ndb.DateTimeProperty(auto_now_add=True)
class Blog(Post):
pass
Однако это требует статического написания моделей. Есть ли способ сделать это динамически (без предварительного объявления их как моделей)?
Обновлять:
Следуя приведенному ниже совету, я решил сохранить все свои объекты под одним и тем же kind
. Позже я мог бы решить изменить это на подклассы (отдельные kind
s для каждого «типа сообщения»), если мои запросы станут беспорядочными. Спасибо всем за ваши отличные советы!