SQLAlchemy, polymorphic inheritance with classical mapping [duplicate]

微笑、不失礼 提交于 2021-01-28 07:00:52

问题


I need to use the classical mapping instead of the declarative, for the last two days I am trying to make inheritance work, I tried with the declarative style and it worked but whatever I tried I cant get it to work when using the old mapping style.

class Item(object):

    def specialised_method(self):
        return "I am not special"


class SpecialisedItem(Item):
    __mapper_args__ = {
        'polymorphic_identity': 'special',
    }

    def specialised_method(self):
        return "I am special"

orm.mapper(Item, enviroment.tables.items,
           polymorphic_on=enviroment.tables.items.c.type,
           polymorphic_identity="normal")


# orm.mapper(SpecialisedItem, enviroment.tables.items,polymorphic_on=enviroment.tables.items.c.type,polymorphic_identity='special')

def test_inheritance(request):
    enviroment=get_enviroment()
    session=enviroment.session
    for item in session.query(Item).filter_by(type="special"):
        print(item.type,item.specialised_method(),item)

throws:

AssertionError: No such polymorphic_identity 'special' is defined

If I remove the polymorphic_identity="normal" from the Item mapper_args then the Item's special method gets called, It seems that the SpecialisedItem never gets considered as a child of Item.


回答1:


The issue is probably that you have not passed the inheritance information to mapper. When using classical mapping, the inheritance structure is not inferred.

Try something like:

class Item(object):
    def specialised_method(self):
        return "I am not special"

class SpecialisedItem(Item):
    def specialised_method(self):
        return "I am special"

orm.mapper(Item, enviroment.tables.items,
           polymorphic_on=enviroment.tables.items.c.type,
           polymorphic_identity="normal")

orm.mapper(SpecialisedItem,
           enviroment.tables.items,

           # you need to specify the parent
           inherits=Item,
           polymorphic_identity='special')

Note that there is no need to specify polymorphic_on in the mapping for SpecialisedItem. Generally, it will be inferred if there is an appropriate foreign key between the underlying tables, and here you are using the same underlying table so the point is mout.



来源:https://stackoverflow.com/questions/44745792/sqlalchemy-polymorphic-inheritance-with-classical-mapping

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!