ndb.StructuredProperty не вызывает методы подкласса ndb.PolyModel
При хранении суперклассов ndb.Polymodel как ndb.StructuredProperty я не смог получить доступ к методам подкласса; Методы суперкласса были вызваны вместо этого и вызывали NotImplementedError's. Вот сокращенная версия того, что я пытаюсь достичь.
class Recipient(polymodel.PolyModel):
name = ndb.StringProperty()
def PrettyPrinting(self):
raise NotImplementedError, 'Rawr'
class ShippingRecipient(Recipient):
address_line_one = ndb.StringProperty()
#there are other properties, but they aren't necessary here.
def PrettyPrinting(self):
return 'Hey, this should be called.'
class LocalRecipient(Recipient):
distribution_location = ndb.StringProperty()
#same deal, more attributes, but useless for this example.
def PrettyPrinting(self):
return 'Hey this should be called.'
class Shipment(ndb.Model):
recipient = ndb.StructuredProperty(Recipient)
Теперь скажите, что я сохранил груз и сохранил ShippingRecipient в поле получателя груза. В хранилище данных, получатель отправления.класс == ['Получатель', 'ShippingRecipient']. Когда я звоню:
shipment = Shipment.get_by_id('some_key')
shipment.recipient.PrettyPrinting()
NotImplementedError возникает вместо реализации ShippingRecipient PrettyPrinting(...). Я хочу, чтобы метод подкласса вызывался при доступе к полю получателя отгрузки. Есть ли способ получить метод подкласса вместо этого? Я знаю, что говоря, что структурированное свойство имеет тип Recipient, вызывает метод суперкласса, но тогда, возможно, я не до конца понимаю, почему они будут хранить подкласс в атрибуте receient.class.
1 ответ
Я не верю, что это может сработать. Он будет хранить только экземпляры получателей.
Если вы посмотрите, как работает PolyModel, все варианты хранятся в качестве базового класса, в вашем примере Recipient
, Он также хранит имена подклассов, когда и сущность извлекается из хранилища данных, он воссоздает конкретный подкласс.
Я действительно сомневаюсь, что они встроили бы этот механизм в реализацию StructuredProperty, и вы обнаружили, что это так.