2013-07-12 25 views
0

我想創建像一個函數接受不同的模型,並動態生成根據在Django的

def dynamic_model(model_name,**kwargs) 
    obj=model_name.object.create(**dct) 
    return obj 

的功能,因爲我不想再這樣做,再創建對象,並將其保存在數據庫對象。您根據傳遞的** kwargs在函數和對象中創建模型名稱。我如何導入路徑運行時以及函數的主體是什麼。

* 而主要的事情我不知道哪個模型,並從那裏進口。所有的事情讓我看到在運行時如何使我可以導入關於功能的型號名稱*

+0

有將不是一件容易的事,因爲你必須自己處理數據庫表(可能使用django-south),因爲Django基於「靜態」模型創建數據庫表。 – Jingo

+0

這個功能有什麼意義?爲什麼'dynamic_model(MyModel,mydict)'比'MyModel.objects.create(** miydict)'更好? –

+0

actully我有一個表單,輸入保存在不同模型的fields.suppose在未來我想添加另一個字段,再擊中一個模型,然後我必須爲該模型創建一個更多的保存過程。這就是爲什麼我想創建一個接受型號名稱和價值並保存在數據庫中的功能對應於該型號和型號字段 – user2576049

回答

2

您可以將路徑在這裏使用eval()。但請記住,此解決方案帶有紅色警報。

def dynamic_model(model_name,**kwargs) 
    obj = eval(model_name + ".object.create(**dct)") 
    return obj 

eval()將字符串解釋爲代碼。正因爲如此,你在使用這個時需要非常謹慎。例如,請務必確保參與評估的字符串絕不是直接用戶輸入。並且清理正在傳遞的字符串。

雖然它可以安全地使用。閱讀關於它here

+0

如何知道該型號的路徑?我如何導入? – user2576049

+0

如果您知道可能的應用程序模塊名稱,那麼建議您先將它們導入到此文件中。 Ex-'from app.models import *' – Sudipta

+0

@ user2576049如果它適合您,請通過[接受答案](http://stackoverflow.com/help/accepted-answer)來關閉該問題。 – Sudipta

1

我真的不明白這個功能的重點,但如果你想要做這樣的事情,你不應該使用eval()這個。

你可以試試這個

from django.db.models.loading import get_model 

def dynamic_model(app_name, model_name,**kwargs) 
    # app_name and model_name should be plain strings 
    # the name of your app and model 
    klass = get_model(app_name, model_name) 
    obj = klass.object.create(**kwargs) 
    return obj 

您不必輸入任何東西,你只需要通過簡單的字符串,即你的應用程序和模型的名稱,它會返回所需的模型類

+0

非常感謝你的好友...你爲我節省了很多努力。 – user2576049

相關問題