Python 在运行时生成代码

Python 在运行时生成代码,python,django,Python,Django,我需要在运行时根据from值生成下面的模型 下面是我试图实现的一个示例,但问题很清楚,即[field.value] def import_data(form, *args, **kw): class ContactCSVModel(CsvModel): for field in form: [field.value] = CharField() class Meta: delimiter = ","

我需要在运行时根据from值生成下面的模型

下面是我试图实现的一个示例,但问题很清楚,即[field.value]

def import_data(form, *args, **kw):
    class ContactCSVModel(CsvModel):  
        for field in form:
           [field.value] =  CharField()

         class Meta:
            delimiter = ","
            dbModel = Contact
            update = {'keys': ["mobile", "group"]}

      return ContactCSVModel.import_data(*args, **kw)
所以上面的代码在生成后看起来是这样的(如果它是静态代码的话)

如何使
[field.value]
以我需要的方式工作?我看过setattr()之类的东西,但我不认为这是我想要的

Forms.py以供参考

COL_CHOICES = [
    ('NONE', 'No Import'),
    ('first_name', 'First Name'),
    ('last_name', 'Last Name'),
    ('company', 'Company'),
    ('mobile', 'Mobile Number'),
    ('email', 'Email Address'),
    ]


class ConfiguratorForm(forms.Form):
    col1 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name')
    col2 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name')
    col3 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name')
    col4 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name')
    col5 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 

class
语句是
type(name,base,dict)
的语法糖,因此您只需构建动态模型属性的词汇表并将其传递给type,即:

def import_data(form, *args, **kw):
    class Meta:
        delimiter = ","
        dbModel = Contact
        update = {'keys': ["mobile", "group"]}
    clsmap = dict((field.value(), CharField()) for field in form)
    clsmap["Meta"] = Meta
    ContactCsvModel = type("ContactCsvModel", (CsvModel,), clsmap)         
    return ContactCSVModel.import_data(*args, **kw)

class
语句是
type(name,base,dict)
的语法糖,因此您只需构建动态模型属性的词汇表并将其传递给type,即:

def import_data(form, *args, **kw):
    class Meta:
        delimiter = ","
        dbModel = Contact
        update = {'keys': ["mobile", "group"]}
    clsmap = dict((field.value(), CharField()) for field in form)
    clsmap["Meta"] = Meta
    ContactCsvModel = type("ContactCsvModel", (CsvModel,), clsmap)         
    return ContactCSVModel.import_data(*args, **kw)

可以在类对象构造后向其添加字段:

def import_data(form, *args, **kw):
    class ContactCSVModel(CsvModel):

         class Meta:
            # ...

    for field in form:
        setattr(ContactCSVModel, field.value(), CharField())

    return ContactCSVModel.import_data(*args, **kw)

可以在类对象构造后向其添加字段:

def import_data(form, *args, **kw):
    class ContactCSVModel(CsvModel):

         class Meta:
            # ...

    for field in form:
        setattr(ContactCSVModel, field.value(), CharField())

    return ContactCSVModel.import_data(*args, **kw)

你是想说你在运行前不知道CSV字段吗?我让用户指定字段属于哪个列。我将添加我的表单,使其更有意义。
setattr(ContactCSVModel,field.value,CharField())
是您正在寻找的构造。@millimoose谢谢,我确实尝试过,但在封闭范围中赋值之前引用了错误“free variable'ContactCSVModel”。我也厌倦了setattr(CsvModel,field.value,CharField())但是出现了错误:“属性名必须是字符串,而不是‘instancemethod’”。您是否试图在运行前说您不知道CSV字段?我让用户指定字段所属的列。我将添加我的表单,使其更有意义。
setattr(ContactCSVModel,field.value,CharField())
是您正在寻找的构造。@millimoose谢谢,我确实尝试过,但在封闭范围中赋值之前引用了错误“free variable'ContactCSVModel”。我也厌倦了setattr(CsvModel,field.value,CharField())但是出现了错误:“属性名必须是字符串,而不是‘instancemethod’”。有趣的是,在ContactCSVModel类中,我应该怎么做,只是‘通过’?@Spike在这种情况下,您不需要编写类,它是在答案的倒数第二行动态创建的。请重新阅读代码:您根本没有
class
语句-该类是通过调用
type
创建的,而不是通过class语句创建的。有趣的是,在ContactCSVModel类中,我会做什么,只是“通过”?@Spike在这种情况下,您不会编写该类,它是在答案的倒数第二行动态创建的。请重新阅读代码:您根本没有
class
语句-该类是通过调用
type
创建的,不是通过类语句。如果
CsvModel
是一个
django.db.Model
子类设置字段,这种方式可能无法正常工作-在
django.db.Model
的元类cf(
ModelBase.\uuu new\uuuuu
)@brunodesthuilliers Hm,我真的不知道有一个元类。在运行时构建整个过程可能是明智的选择。如果
CsvModel
是一个
django.db.Model
子类设置字段,这种方式可能无法正常工作-在
django.db.Model
的元类cf(
ModelBase.\uu new\uu
)@brunodesshuilliers Hm,我真的不知道有一个元类。在运行时构建整个过程可能是明智的选择。