2014-12-31 32 views
0

我想將模型名稱作爲URL參數傳遞,因此我可以使用它來訪問我視圖中的指定模型類。例如:如何在Django中將模型明確標識爲小寫字符串

/app_label/MODEL_NAME

views.py

from django.db.models.loading import get_model 
model = get_model(app_label, model_name) 

的問題是 - 我想我的網址是不區分大小寫。因此,我不能只用上面的代碼,因爲這些模型的人能像這些如下:

爲MyModel,MySuperModel,MyAwesomeSuperModel

有什麼辦法明確識別模型爲小寫串?

我曾考慮過使用table_name但是這意味着每次處理請求時都會循環播放項目中的每個模型。效率不高。

+0

如果你希望URL不區分大小寫,那麼你不應該使用模型類名稱,它們的名字只是大小寫不同的,所以不會有任何歧義。 – aalizadeh

+0

如果你沒有太多的模型,你可以創建一個字典映射模型的規範名稱模型本身......可能有DRYer的方式來做到這一點,但這將是快速和容易的。 – rfj001

+0

我想創建一個通用的解決方案(一個可重用的應用程序),所以我不能控制有多少模型或他們的名字是什麼 – dev9

回答

1

恐怕你將不得不遍歷應用的機型列表中,但您可以緩存它:

from django.core.exceptions import ImproperlyConfigured 
from django.db.models import get_app, get_models 

APPS_MODELS = {} 

def get_model(app_name, model_name): 

    app_models = APPS_MODELS.get(app_name) 
    if app_models: 
     return app_models.get(model_name) 

    try: 
     app = get_app(app_name) 
    except ImproperlyConfigured: # no such app 
     return None 

    APPS_MODELS[app_name] = dict((model._meta.model_name, model) 
            for model in get_models(app)) 

    return APPS_MODELS[app_name].get(model_name) 
0
your_model_object.__class__.__name__.lower() 

爲您提供了型號名稱的小寫名字,如果它可以幫助你

+2

'model._meta.model_name'已經在小寫:-) – catavaran

+0

@catavaran哦好 – doniyor

相關問題