如果没有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."
答案 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)
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')
答案 5 :(得分:-2)
如果您将模型名称作为字符串传递,我猜一种方法可能是
modelname = "User"
model = globals()[modelname]
但是在某些情况下,使用全局变量()可能会有点危险。所以要小心处理:)