2011-11-26 70 views
0

嗨#1人,Django的:動態模式字段定義

我有一個模型定義這是相當單調,它包括箱從1到50

領域對於概念的證明,我寫的但是必須有一個更好的方式來自動化模型定義並保持代碼的整潔。

到目前爲止,我做了後續的方式:

class Bins(models.Model): 
    p1 = models.DecimalField(_('bin 1'), max_digits=6, decimal_places=2) 
    p2 = models.DecimalField(_('bin 2'), max_digits=6, decimal_places=2) 
    p3 = models.DecimalField(_('bin 3'), max_digits=6, decimal_places=2) 
    ... 
    p50 = ... 

Django wiki,我發現動態模型定義的總結,但它似乎它不允許在定義循環:

我試過下面的代碼,但是我得到一個錯誤消息,MAX_BIN = 2是一個無效的語法。 我明白我不能像我試過的那樣在字段上迭代的錯誤。

Bins = type('Bins', (models.Model,), {  
    MAX_BIN = 50 
    for i in range(MAX_BIN): 
     name_sects = ["p", str(i)] 
     "".join(name_sects): model.DecimalField(_("".join([bin ', str(i)])), 
          max_digits=6, decimal_places=2) 
    }) 

這樣的動態類定義一般可能嗎? 如果是這樣,定義類的最佳方法是什麼?

謝謝你的幫助!

+1

什麼只是創造一個具有#和點回'Bins'模型的新'Bin'模式? – sdolan

+0

這個模塊很適合動態模型http://pypi.python.org/pypi/django-dynamo – Paulo

回答

2

在您當前的版本中,您的循環在dict的定義中。這是不允許的。然而,你可以在你撥打type的電話之外的字典中定義你的字段,這很好。像

attrs = { 
    other_field = models.IntegerField(), 
    '__module__': 'myapp.models', 
} 

MAX_BIN = 50 
    for i in range(MAX_BIN): 
     name_sects = ["p", str(i)] 
     attrs["".join(name_sects)] = model.DecimalField(_("".join(['bin ', str(i)])), 
      max_digits=6, decimal_places=2) 

Bins = type('Bins', (models.Model,), attrs) 
+0

謝謝你的回答!該代碼似乎解決了這個問題,但是當我執行它時,我得到了下面的錯誤信息:「KeyError:'myapp.model'」(我已將'myapp'更改爲我的模型的名稱)。錯誤的原因是什麼? – neurix

+1

'myapp'是你的應用程序的名稱,它在'installed_apps'中嗎? – second

+0

謝謝你的提示。我忘了提到這個文件夾,因爲它在settings.py中提到:apps.myapp.models。謝謝您的回答!很好的解決方案。 – neurix

0

一個簡單的解決方案,解決了同一個問題:

class Bins(models.Model): 
    MAX_BIN = 50 
    for i in xrange(1, MAX_BIN + 1): 
     vars()['p' + str(i)] = models.DecimalField('bin ' + str(i), 
      max_digits=6, decimal_places=2) 
相關問題