如何动态检索Django模型类?

时间:2009-01-04 22:32:50

标签: python django django-models django-queryset

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

model = 'User' [in Django namespace]
model.objects.all()

......而不是:

User.objects.all().

编辑:我正在尝试根据命令行输入进行此调用。是否可以避免使用import语句,例如

model = django.authx.models.User

没有Django返回错误:

"global name django is not defined."

6 个答案:

答案 0 :(得分:41)

对于Django 1.7+,有一个applications registry。您可以使用apps.get_model方法动态获取模型。

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')

答案 1 :(得分:38)

我认为你正在寻找这个:

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

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

Django 1.7 +的更新:根据Django的deprecation timeline,Django 1.7中已弃用django.db.models.loading,将在Django 1.9中删除。正如Alasdair's answer所指出的, 在Django 1.7+中,有一个applications registry。您可以使用apps.get_model方法动态获取模型:

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')

答案 2 :(得分:3)

from django.authx.models import User
model = User
model.objects.all()

答案 3 :(得分:1)

  

model = django.authx.models.User

     

? Django返回一个错误,“全局   名字django没有定义。“

Django不会返回错误。 Python确实。

首先,你必须导入模型。您必须使用

导入它
from django.authx.models import User

其次,如果您收到错误django未定义,则表示Django安装不正确。您必须在PYTHONPATH上安装Django或安装在Python lib / site-packages中。

要正确安装Django,请参阅http://docs.djangoproject.com/en/dev/intro/install/#intro-install

答案 4 :(得分:0)

类是Python中的“第一类”对象,这意味着它们可以像所有其他对象一样被传递和操作。

模型是类 - 您可以通过使用类语句创建新模型来判断:

class Person(models.Model):
    last_name = models.CharField(max_length=64)

class AnthropomorphicBear(models.Model):
    last_name = models.CharField(max_length=64)

PersonAnthropomorphicBear标识符都绑定到Django类,因此您可以传递它们。如果要创建在模型级别工作的辅助函数(并共享一个公共接口),这可能很有用:

def print_obj_by_last_name(model, last_name):
    model_name = model.__name__
    matches = model.objects.filter(last_name=last_name).all()
    print('{0}: {1!r}'.format(model_name, matches))

因此print_obj_by_last_name适用于PersonAnthropomorphicBear模型。只需传递模型:

print_obj_by_last_name(model=Person, last_name='Dole')
print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy')

答案 5 :(得分:-2)

如果您将模型名称作为字符串传递,我猜一种方法可能是

modelname = "User"
model = globals()[modelname]

但是在某些情况下,使用全局变量()可能会有点危险。所以要小心处理:)