model_name = "MyModel" #This is coming from a different input, it can be any different string name not necessarily "MyModel"
model_name.objects.filter()
AttributeError: 'str' object has no attribute 'objects'
我如何才能做到这一点,我已经尝试过了:
exec(model_name)
input(model_name)
[model_name]
我知道有一种可能的方法可以使用apps.get_model(model_name="string")
导入模型,但我不想使用这种方法,因为模型已经预先导入了。有没有其他方法可以将model_name(字符串类型)转换为可以插入INSERTHERE.objects.filter()
的类型
更新:我知道一个更简单的实现是使用if + elif语句来查询正确的模型。我正在试图找到一种方法来避免使用if + 100 elif语句。
2条答案
按热度按时间afdcj2ne1#
正如你提到的,如果你想使用.objects,你需要首先获取
Model
对象。您可以使用以下任一方法执行此操作:
或者从字符串开始
预先导入的模型是没有问题的,这实际上是一件好事,允许您使用我编写的第一个代码片段。
当你使用点表示法时,例如
foo.bar
,你试图从foo
对象访问bar
属性。在django中,Model类(来自django.db.models)有一个名为
objects
的属性,该属性包含filter()
、all()
等方法(=函数)。您希望获取Model对象并访问其
objects
属性以与数据库通信(例如,使用filter()
)当你执行“MyModel”.objects.all()时,你试图访问一个
string
对象的objects
属性,而不是从一个Model
对象,这就是为什么它不能以这种方式工作。guz6ccqo2#
字符串不能直接是一个类。在你的例子中,你可以使用字符串到Model类Map来直接查询信息,像这样:
(But)如果
model_name
不是字符串,而是ForeignKey关系,那么可以使用以下代码:或者,您可以查看
Generic ForeignKey
,以支持直接使用的不同类的模型(而不是字符串)。