0

У меня есть ситуация, когда модель, которую я использую, обладает рядом свойств, необходимых для всех объектов и нескольких, которые относятся к одной из двух альтернатив, например, в следующем примере:Expando vs regular Модель с пустыми свойствами

class Machine(ndb.Model): 

    #Properties for all machines: 
    price = ndb.FloatProperty() 
    model = ndb.StringProperty() 
    vendor = ndb.KeyProperty() 
    #... 

    #Properties exclusive to type A machines: 
    foo1 = ndb.StringProperty() 
    foo2 = ndb.StringProperty() 

    #Properties exclusive to type B machines: 
    bar1 = ndb.StringProperty() 
    bar2 = ndb.StringProperty() 

Из того, что я понимаю, я мог бы взять один из двух путей. Либо я делаю его регулярным ndb.Model, и просто оставляю некоторые свойства без содержимого, или я мог бы использовать модель ndb.Expando и заранее задавать фиксированные свойства и просто добавлять остальные в зависимости от случая.

Как я понимаю, модель Expando полезна, когда вы не знаете свойств, которые вам понадобятся, но я заранее знаю все необходимые свойства (foo1, foo2, bar1, bar2). Должен ли я использовать Expando или это нормально использовать обычный ndb.Model и оставить несколько свойств пустым для каждого объекта?

ответ

1

Для вашего сценария я бы серьезно рассмотреть вопрос об использовании ndb.PolyModel

class Machine(ndb.Model): 

    #Properties for all machines: 
    price = ndb.FloatProperty() 
    model = ndb.StringProperty() 
    vendor = ndb.KeyProperty() 

class MachineA(Machine): 
    foo1 = ndb.StringProperty() 
    foo2 = ndb.StringProperty() 

class MachineB(Machine): 
    bar1 = ndb.StringProperty() 
    bar2 = ndb.StringProperty() 

Это то позволяет запрашивать все станка,

по Machine.query() или отдельных типов машин с MachineB.query()

Только мой 2c. (У меня есть ряд проектов, которые используют это. Например, Продукт и различные типы продуктов, которые имеют разные дополнительные свойства), например, Plant vs Pump, оба являются основными продуктами, с ценой, категоризацией, фотографиями и т. Д.), Но растение будут иметь разные классификации (цветение, цветение), а насос будет иметь расход, ватты и т. д.) Но я могу найти все все продукты за вычетом < $ 25 (растение или иное) Product.query(Product.price < 25)

+0

Спасибо за ваш ответ! Могу ли я это сделать, если машина является структурированным свойством? У меня также есть случай, когда это происходит, точно так же, как это происходит, вместо того, чтобы Machine являлся полноправным объектом, это StructuredProperty (свойство внутри более крупного объекта). Могу ли я по-прежнему делать то, что вы предлагаете здесь в этом случае? –

+0

Хотя конечный результат может быть аналогичным, подходы разные, и у каждого из них есть сильные и слабые стороны. Существуют некоторые ограничения, связанные с повторением свойств вложенности, а запросы для элементов со структурированными свойствами, которые вложены, не работают так, как вам может понравиться в ряде сценариев. –

+0

В моем случае у них мало данных, и это относится только к сущности, и из того, что я тестировал, этого достаточно для запросов. Я имел в виду следующее: класс «Вещи», который имеет структурированное свойство Machine, которое имеет два типа: MachineA и MachineB. Возможно ли это, или я должен избегать этого? –

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