如果没有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."
有帮助吗?

解决方案

我认为你正在寻找这个:

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

其他提示

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

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
from django.authx.models import User
model = User
model.objects.all()
  

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

班级是“头等舱”。 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 将适用于 Person AnthropomorphicBear 模型。只需传递模型:

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top