我可以将类名作为Python中的变量吗?

Als*_*ton 1 python django

我可以在较新的 python 版本中将类名设置为变量吗?

我的意思是我可以将以下说明简短化吗?

 if target == "course":
    return Course.objects.all()[start:end]`
 elif target == "Subject":
    return Subject.objects.all()[start:end]
 elif target == "Teacher":
    return Teacher.objects.all()[start:end]
Run Code Online (Sandbox Code Playgroud)

更简短地说:

 return VARIABLE.objects.all()[start:end]
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 5

这看起来像 Django ORM。如果您正在使用 Django 应用程序,那么有更好的方法

\n
from django.apps import apps\n\nModel = apps.get_model(app_label="myapp", model_name=target)\n
Run Code Online (Sandbox Code Playgroud)\n

model_name区分大小写。这是同一件事的快捷方式:

\n
Model = apps.get_model(f"myapp.{target}")\n
Run Code Online (Sandbox Code Playgroud)\n

这里的一大优点是模型名称作为字符串传递,因此不会出现由于导入的模型类在包中创建循环依赖项而导致的循环导入问题,或者由于过早导入模型类而导致的应用程序初始化问题。

\n

正如文档中指出的,模型导入的时间在 Django 应用程序中很敏感:

\n
\n

应用程序注册表分三个阶段初始化。在每个阶段,Django 按照 的顺序处理所有应用程序INSTALLED_APPS

\n

首先 Django 导入INSTALLED_APPS.

\n

如果它\xe2\x80\x99是一个应用程序配置类,Django会导入应用程序的根包,由其name属性定义。如果它\xe2\x80\x99是Python包,Django会在子模块中查找应用程序配置apps.py,否则创建默认应用程序配置。

\n

在此阶段,您的代码不应\xe2\x80\x99 导入任何模型!

\n

换句话说,您的应用程序\xe2\x80\x99根包和定义应用程序配置类的模块不应\xe2\x80\x99导入任何模型,即使是间接导入。

\n

严格来说,Django 允许在加载应用程序配置后导入模型。但是,为了避免对 的顺序产生不必要的限制INSTALLED_APPS,\xe2\x80\x99s 强烈建议在此阶段不要导入任何模型。

\n
\n