2015-04-13 42 views
4

比方說,我有以下Django模型查詢的Django模型:使用型號名稱字符串輸入

class ModelB(models.Model): 
    title = models.CharField(max_length=20) 

class ModelD(models.Model): 
    name = models.CharField(max_length=20) 

在Django的ORM,我想讀一個這將是一個名模型,並用它來查詢。類似這樣的:

>>b = 'ModelB' 
>>b.objects.all() 

這顯然不起作用,因爲它是一個字符串。我曾看過ContentType,但我不確定這對我的情況會有幫助。有什麼建議麼?

我也試過在Contentype這樣做get操作:

>>> z = ContentType.objects.get(model='modelb') 
>>> z 
<ContentType: model b> 
>>> z.__dict__ 
{'model': u'modelb', '_state': <django.db.models.base.ModelState object at 0x7f195346c150>, 'id': 14, 'app_label': u'testapp'} 
>>> 

,但我不知道如何從這裏繼續進行!

回答

8

如果你使用Django < 1.7,我認爲你可以做到這一點。

from django.db.models.loading import get_model 

z = ContentType.objects.get(model='modelb') 
ModelB = get_model(z.app_label, 'ModelB') 

Django的> = 1.7,則可以

from django.apps import apps 

z = ContentType.objects.get(model='modelb') 
ModelB = apps.get_model(z.app_label, 'ModelB') 

然後你可以使用ModelB查詢。

+2

'應用程序'實際上在1.7中可用。另外,'apps'是'django.apps'中的一個對象,所以您需要'從django.apps導入應用程序'; apps.get_model(...)'。 – knbk

+0

@knbk,注意到這一點。感謝您的更正。 –