2015-05-08 31 views
1

我有一個連接表繼承,例如Animal,Cat和Dog。我想讓用戶創建一個新的動物。列出多態繼承選擇並基於該選擇創建實例

有沒有辦法讓所有類型(貓,狗)進入用戶列表?有沒有辦法讓用戶選擇並從中創建實例? (我不想硬編碼if choice == "cat": Cat()。)

+0

是否允許用戶在python中添加類,或者是否希望用戶能夠在數據庫中添加表?或兩者?你想讓用戶註冊還是你想讓代碼自動反思答案? – AlexLordThorsen

回答

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看整個層次。