如何动态检索Django模型类?

the*_*man 26 python django django-models django-queryset

如果没有Django模型的完整模块路径,是否可以执行以下操作:

model = 'User' [in Django namespace]
model.objects.all()
Run Code Online (Sandbox Code Playgroud)

......而不是:

User.objects.all().
Run Code Online (Sandbox Code Playgroud)

编辑:我试图根据命令行输入进行此调用.是否可以避免导入声明,例如,

model = django.authx.models.User
Run Code Online (Sandbox Code Playgroud)

没有Django返回错误:

"global name django is not defined."
Run Code Online (Sandbox Code Playgroud)

Dan*_*aab 42

我想你正在寻找这个:

from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')
Run Code Online (Sandbox Code Playgroud)

当然还有其他方法,但如果您不知道需要将哪些模型文件导入命名空间,这就是我处理它的方法.(注意,如果没有先了解它所属的应用程序,就没有办法安全地获取模型.如果你想在迭代所有应用程序的模型时测试你的运气,请查看loading.py的源代码.)

更新:根据Django的弃用时间表,django.db.models.loading已在Django 1.7中弃用,并将在Django 1.9中删除.正如Alasdair的回答所指出,Django 1.7增加了一个用于动态加载模型的新API.


Ala*_*air 41

对于Django 1.7+,有一个应用程序注册表.您可以使用该apps.get_model方法动态获取模型.

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
Run Code Online (Sandbox Code Playgroud)