不同文件上的多态身份

时间:2019-03-26 14:32:52

标签: python sqlalchemy

我正在用SQLAlchemy编写一个Python项目,我有2个类-基类和子类。子类继承自基类,并用作基类的type字段的多态标识。

文件1:

class Animal(Base):
    __tablename__ = "animals"
    animal_id = Column(String, primary_key=True)
    animal_type = Column(String)
    family = Column(String)

    @staticmethod
    def init(animal_id):
        return Sessions.main.query(Animal).filter_by(animal_id=animal_id).first()

    __mapper_args__ = {
        "polymorphic_on": animal_type,
        "polymorphic_identity": "animals"
}

文件2:

from animal.animal import Animal

class Lion(Animal):
    __mapper_args__ = {
        "polymorphic_identity" = "lion"
    }

这两个类放置在不同的文件中,但是当我启动一个动物实例(实际上应该作为狮子实例启动)实例时,尽管确实存在No such polymorphic identity,但它引发了一个异常,但是在另一个文件。

    lion = Animal.init('lionid1')
AssertionError: No such polymorphic identity 'lion' is defined

当我将Lion类移到Animal类所在的文件时,初始化成功,但这不是我想要的解决方案,因为这两个类最终对于一个类来说都太大了文件。

我也无法将Lion类导入到基类的文件中,因为子类继承自基类,然后它们又互相导入,这也会导致错误:

    from lion.lion import Lion  # added on the top of file 1 
ImportError: cannot import name 'Lion'

关于如何解决它的任何想法?如何在不引起任何这些错误的情况下将这两个类放置在不同的文件中?

1 个答案:

答案 0 :(得分:0)

您仍然需要在某处导入该模块,否则该类将永远不会注册。只是不要将其导入animal.animal模块的顶部。

您可以在程序包级别或在animal.animal模块的底部导入它(因此在创建基Animals基类后 之后)。导入它会使SQLAlchemy意识到它的存在。