使用模型名称字符串输入查询django模型

Abh*_*hek 4 python django django-orm

假设我有以下django型号:

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

class ModelD(models.Model):
    name = models.CharField(max_length=20)
Run Code Online (Sandbox Code Playgroud)

在django ORM中,我正在尝试读取一个字符串,该字符串将是模型的名称,并使用它来查询.像这样的东西:

>>b = 'ModelB'
>>b.objects.all()
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为它是一个字符串.我查看了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'}
>>>
Run Code Online (Sandbox Code Playgroud)

但我不知道如何从这里继续前进!

Rod*_*ier 10

如果您使用Django <1.7,我认为您可以这样做.

from django.db.models.loading import get_model

z = ContentType.objects.get(model='modelb')
ModelB = get_model(z.app_label, 'ModelB')
Run Code Online (Sandbox Code Playgroud)

对于django> = 1.7,你可以

from django.apps import apps

z = ContentType.objects.get(model='modelb')
ModelB = apps.get_model(z.app_label, 'ModelB')
Run Code Online (Sandbox Code Playgroud)

然后你可以ModelB用来查询.

  • 实际上,`apps`在1.7中可用.此外,`apps`是`django.apps`中的一个对象,所以你需要`来自django.apps的导入应用程序; apps.get_model(...)`. (2认同)