首页 > 解决方案 > 如何在 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'

我怎样才能传递班级名称?

标签: pythondjangodjango-modelseval

解决方案


你不能用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_nametable_name = 'Files{}'.format(name.capitalize())

注意:通常相关字段大写。一个写usersuser_set,不是Users


推荐阅读