2015-04-13 2 views
4

Допустим, у меня есть следующие Джанго модели:Запрос модели Джанго, используя имя модели входной строки

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

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

В Джанго ОРМ, я пытаюсь прочитать строку которая будет имя модель, и используйте его для запроса. Что-то вроде этого:

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

Это, очевидно, не работает, так как это строка. Я посмотрел на ContentType, но я не уверен, как это будет полезно в моем сценарии. Какие-либо предложения?

Я также пытался делать get операцию на Contentype, как это:

>>> 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') 

Для Джанго> = 1.7,

from django.apps import apps 

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

вы можете использовать ModelB для запроса.

+2

'apps' доступно в версии 1.7, на самом деле. Кроме того, 'apps' является объектом в' django.apps', поэтому вам нужно 'from django.apps import apps; apps.get_model (...) '. – knbk

+0

@knbk, заметил это. спасибо за исправление. –

Смежные вопросы