我有一个连接表继承,例如Animal,Cat和Dog。我想允许用户创建一个新的Animal。
有没有办法让所有类型(猫,狗)进入用户列表?有没有办法让用户选择并创建一个实例? (我不想硬编码if choice == "cat": Cat()
。)
答案 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]()
如果层次结构中有更多级别,例如CalicoCat
和HairlessCat
,则可以使用polymorphic_iterator
查看整个层次结构。