2013-11-09 2 views
0

При хранении суперклассов ndb.Polymodel в качестве ndb.StructuredProperty мне не удалось получить доступ к методам подкласса; Вместо этого были вызваны методы суперкласса и повышение NotImplementedError. Вот сокращенная версия того, что я пытаюсь выполнить.ndb.StructuredProperty не вызывает методы подкласса ndb.PolyModel

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 в поле получателя пересылкой в. В хранилище данных отправитель recipient.class == ['Получатель', 'ShippingRecipient']. Когда я звоню:

shipment = Shipment.get_by_id('some_key') 
shipment.recipient.PrettyPrinting() 

NotImplementedError поднят вместо реализации ShippingRecipient из PrettyPrinting (...). Я хочу, чтобы метод подкласса вызывался при доступе к полю получателя отправки. Есть ли способ, которым я могу перейти к подклассу? Я знаю, что говоря, что структурированное свойство имеет тип Recipient, вызывает вызов метода суперкласса, но, возможно, я не совсем понимаю, почему они будут хранить подкласс в атрибуте recipient.class.

ответ

1

Я не верю, что это может сработать. Он будет хранить только экземпляры получателей.
Если вы посмотрите, как работает PolyModel, все варианты сохраняются в качестве базового класса, в вашем примере Recipient. Он также сохраняет имена подкласса, когда и сущность, которую он извлекает из хранилища данных, он воссоздает конкретный подкласс.

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

+0

Да, я не думаю, что это сработает. Кажется странным, что StructuredProperty даже поддерживал Polymodel, считая, что вы не можете использовать полиморфное поведение ... но, опять же, было бы неприятно проверять такие вещи. – super

+0

Я не думаю, что поведение PolyModel было даже рассмотрено для StructuredProperties. Вы всегда можете использовать адаптер после факта и обернуть свойства в списке для такого поведения. –

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