2013-11-10 5 views
1

В моем проекте GAE у меня есть базовый класс под названием Part. Из этого класса я получаю другие классы, такие как двигатель и аккумулятор.Google App Engine - извлечение экземпляров классов, полученных из базового класса

Если я запускаю следующее:

motors = Motor.query().fetch() 
batterys = Battery.query().fetch() 

я буду получать все детали, но я ищу что-то более элегантное. Если я бегу:

parts = Part.query().fetch() 

я получаю пустой список [].

Как выполнить указанный выше запрос и получить все результаты в одном списке? Спасибо

ответ

2

Вы можете сделать это, но классы всех ваших частей должны наследовать от PolyModel

https://developers.google.com/appengine/docs/python/ndb/polymodelclass

Так

class Part(ndb.PolyModel): 
    #stuff 

class Motor(Part): 
    # stuff 

class Wheel(Part): 
    # stuff 

parts = Part.query().fetch() 

Однако все элементы хранятся в хранилище данных как части, они имеют дополнительные classes атрибут, который называет каждый из классов в его наследственной иерархии. Затем, когда объект извлекается, создается соответствующий подкласс.

Другим потенциальным недостатком, имена свойств в сохраненной модели являются объединением всех подклассов, если у вас есть значения по умолчанию для любого из свойств. Я не проверял, насколько это далеко. Поэтому, если у вас много разных свойств во всех подклассах, вы можете хранить много пустых свойств и нести расходы на хранение всех имен свойств в каждом объекте.

1

В хранилище данных нет концепции наследования, и он не знает, что ваши типы сущностей происходят из Части.

Существует на самом деле не какой-либо способ сделать такого рода вещи с GAE: предок ключи на самом деле не ответ, так как они будут иметь все объекты Motor/Батарея нисходящие из одной части, которая может серьезно ограничить обновление ставки.

Лучший способ смоделировать этот вид отношений будет действительно отбросить отдельные модели и имеют одну часть модели, с part_type поле, которое может быть "motor" или "battery".

+0

Несмотря на то, что хранилище данных не имеет такой возможности, PolyModel действительно предоставляет такое оборудование. –

+0

@TimHoffman Спасибо, я полностью забыл о PolyModel. –

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