36

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

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

...相对于:

User.objects.all().

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

model = django.authx.models.User

没有 Django 返回错误:

"global name django is not defined."
4

6 回答 6

57

我想你正在寻找这个:

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

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

Django 1.7+ 的更新:根据 Django 的弃用时间线django.db.models.loading在 Django 1.7 中已弃用,并将在 Django 1.9 中删除。正如Alasdair 的回答中所指出的,在 Django 1.7+ 中,有一个应用程序注册表。您可以使用该apps.get_model方法动态获取模型:

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
于 2009-01-04T23:11:28.400 回答
48

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

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
于 2015-02-07T09:19:49.723 回答
1
from django.authx.models import User
model = User
model.objects.all()
于 2009-01-04T22:34:45.013 回答
0

模型 = django.authx.models.User

? Django 返回错误,“未定义全局名称 django。”

Django 不返回错误。Python 可以。

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

from django.authx.models import User

其次,如果你得到一个django未定义的错误,那么 Django 没有正确安装。你必须有 DjangoPYTHONPATH或者安装在你的 Python 库/站点包中。

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

于 2009-01-04T23:42:46.310 回答
0

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

模型是类——你可以从使用类语句创建新模型的事实中看出:

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

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

Person和标识符都AnthropomorphicBear绑定到 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')
于 2009-01-04T23:43:50.613 回答
-3

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

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

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

于 2009-01-04T22:40:44.157 回答