2013-04-18 107 views
0

我需要在運行時根據from值生成以下模型。在運行時生成代碼

下面是什麼,我想acheive一個例子,但問題是明確的,即[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) 

所以上面的代碼看起來像這樣它生成後(如果它是類型化的靜態代碼)....

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

     first_name = CharField() 
     mobile = CharField() 
     last_name = 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') 
+1

您是否想說在運行時之前不知道CSV字段? – adrianp

+0

我讓用戶指定字段屬於哪個列。我將添加我的表單,以便更有意義。 – Prometheus

+1

'setattr(ContactCSVModel,field.value,CharField())'是你正在尋找的構造。 – millimoose

回答

2

它的構造後,您可以字段添加到類對象:

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) 
+1

如果'CsvModel'是一個'django.db.Model'子類設置字段,這種方式可能無法正常工作 - 'django.db.Model'中的模型字段有很多事情發生s metaclass,cf https://github.com/django/django/blob/stable/1.5.x/django/db/models/base.py('ModelBase .__ new__') –

+0

@brunodesthuilliers嗯,我沒有真正知道有一個元類涉及。然後在運行時構造整個事物可能是理智的選擇。 – millimoose

3

class語句是type(name, bases, dict)所以你可以建立自己的動態模型屬性的dictionnary,並通過它來輸入語法糖,即:

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) 
+0

有趣的是,我會在ContactCSVModel類中做什麼,只是'傳遞'? – Prometheus

+0

@Spike在這種情況下,您不會編寫類,它是在答案的倒數第二行上動態創建的。 – millimoose

+2

重讀代碼:你有一個'class'語句 - 類是通過調用'type'而不是類聲明來創建的。 –

相關問題