У меня есть ситуация, когда модель, которую я использую, обладает рядом свойств, необходимых для всех объектов и нескольких, которые относятся к одной из двух альтернатив, например, в следующем примере: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 и оставить несколько свойств пустым для каждого объекта?
Спасибо за ваш ответ! Могу ли я это сделать, если машина является структурированным свойством? У меня также есть случай, когда это происходит, точно так же, как это происходит, вместо того, чтобы Machine являлся полноправным объектом, это StructuredProperty (свойство внутри более крупного объекта). Могу ли я по-прежнему делать то, что вы предлагаете здесь в этом случае? –
Хотя конечный результат может быть аналогичным, подходы разные, и у каждого из них есть сильные и слабые стороны. Существуют некоторые ограничения, связанные с повторением свойств вложенности, а запросы для элементов со структурированными свойствами, которые вложены, не работают так, как вам может понравиться в ряде сценариев. –
В моем случае у них мало данных, и это относится только к сущности, и из того, что я тестировал, этого достаточно для запросов. Я имел в виду следующее: класс «Вещи», который имеет структурированное свойство Machine, которое имеет два типа: MachineA и MachineB. Возможно ли это, или я должен избегать этого? –