python - 如何在 Django 模型中使用字符串传递类名
问题描述
我想获取与模型实例相关的所有对象。因为我的代码有点通用,所以我将相关表作为字符串传递并使用eval()
函数将其转换为相关表类。但我得到了一个错误。假设我们有一个像这样的表的实例self.casefile
;这是我的代码的一部分:
def related_models_migration(self):
opts = self.casefile._meta
table_name = 'Files'
for f in opts.many_to_many:
name = ''.join(f.name.split('_'))
table_name += name.capitalize()
objects = self.casefile.eval(table_name).all()
我得到了这个错误:
AttributeError Traceback (most recent call last)
<ipython-input-6-025484eeba97> in <module>
----> 1 obj.related_models_migration()
~/Documents/kangaroo/etl/data_migration.py in related_models_migration(self)
28 name = ''.join(f.name.split('_'))
29 table_name += name.capitalize()
---> 30 objects = self.casefile.eval(table_name).all()
31
32 for d in dir(etl.models):
AttributeError: 'FilesCasefiles' object has no attribute 'eval'
我怎样才能传递班级名称?
解决方案
你不能用eval(..)
它。您可能想在这里使用的是getattr(..)
:
def related_models_migration(self):
opts = self.casefile._meta
table_name = 'Files'
for f in opts.many_to_many:
name = ''.join(f.name.split('_'))
table_name += name.capitalize()
objects = getattr(self.casefile, table_name).all()
但是,我不确定您是否应该在此处使用,table_name += …
因为它每次都会向. 您可能想使用类似.table_name
table_name = 'Files{}'.format(name.capitalize())
注意:通常相关字段不大写。一个写
users
或user_set
,不是。Users
推荐阅读
- c++ - C++11 new way for Iterating through vectors?
- python - 通过两个 python 集合的不同元素过滤列表
- android - LiveDataReactiveStreams.fromPublisher crash application when not internet connection
- azure - Azure Logic 应用程序查询应用程序见解返回代码而不是 html
- python - python程序使用文件控制来监控文件
- python - 抓取文件的href后如何下载文件,其中没有http或https
- json - Why is JSON being detected as empty?
- swift - 如何快速无损地缩放 UIImages?
- c# - 为 EF Where() 子句动态构建表达式树
- algorithm - 十五拼图,BFS vs DFS的区别