列出多态继承选择并基于该选择创建实例

时间:2015-05-08 21:27:37

标签: python sqlalchemy

我有一个连接表继承,例如Animal,Cat和Dog。我想允许用户创建一个新的Animal。

有没有办法让所有类型(猫,狗)进入用户列表?有没有办法让用户选择并创建一个实例? (我不想硬编码if choice == "cat": Cat()。)

1 个答案:

答案 0 :(得分:3)

SQLAlchemy跟踪父模型的多态子项。使用Animal模型上的inspect查找mapping of polymorphic identities

>>> from sqlalchemy import inspect
>>> i = inspect(Animal)
>>> i.polymorphic_map
{'cat': <Mapper at 0x7fb4c7a8b390; Cat>,
 'dog': <Mapper at 0x7fb4c7a98240; Dog>}

您可以使用class_属性从映射器中获取该类。

>>> i.polymorphic_map['cat'].class_
__main__.Cat

通过这两部分,您现在可以获得要呈现给用户的类型列表,并且可以根据所选值实例化模型。

types = inspect(Animal).polymorphic_map.keys()
user_input = 'cat'
new_cat = inspect(Animal).polymorphic_map[user_input]()

如果层次结构中有更多级别,例如CalicoCatHairlessCat,则可以使用polymorphic_iterator查看整个层次结构。