Python 在运行时生成代码
我需要在运行时根据from值生成下面的模型 下面是我试图实现的一个示例,但问题很清楚,即[field.value]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 = ","
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,我真的不知道有一个元类。在运行时构建整个过程可能是明智的选择。