2014-07-16 68 views
0

我在sql數據庫中有3個表。我需要爲這些創建django模型。Django三個關係表的模型設計幫助

table1: Module 

|modulename |moduleversion |notes  | 
----------------------------------------- 
|M1   |1    |module 1 | 
|M2   |2    |module 2 | 
|M3   |1    |module 3 | 
|M4   |1    |module 4 | 
|M5   |3    |module 5 | 
----------------------------------------- 
table2: metamodule 

|metamodulename |metaversion |modulename | 
--------------------------------------------- 
|A    |1    |M1   | 
|B    |2    |M1   | 
|C    |1    |M3   | 
|A    |1    |M4   | 
|B    |2    |M2   | 
--------------------------------------------- 

table3: release 

|releasenumber |notes  |metamodules| 
----------------------------------------- 
|R1    |Rel ver 1 |A   | 
|R1    |Rel ver 1 |B   | 
|R2    |Rel ver 2 |A   | 
|R2    |Rel ver 2 |C   | 
|R3    |Rel ver 3 |C   | 
----------------------------------------- 

這些表具有外鍵約束。我很困惑哪個關係模型用於創建上述表格的模型。

解決方案:

from django.db import models 

class module(models.Model): 
    modulename = models.CharField(max_length=50) 
    moduleversion = models.IntegerField(default=0) 
    notes = models.CharField(max_length=50) 

    def __unicode__(self): 
     return unicode(self.modulename) 


class metamodule(models.Model): 
    metamodulenname = models.CharField(max_length=50) 
    metaversion = models.IntegerField(default=0) 
    modulename = models.Foreignkey(module) 

    def __unicode__(self): 
     return unicode(self.metamodulename) 


class release(models.Model): 
    releasenumber = models.CharField(max_length=2) 
    notes = models.CharField(max_length=50) 
    metamodules = models.ManytoMany(metamodule) 

    def __unicode__(self): 
     return unicode(self.releasenumber) 

在這裏,我想到一個解決方案。 請放下您的建議和解決方案,以糾正我的解決方案

回答

0

的幾點思考:

  1. 始終使用大寫單詞爲你的模型:ModuleMetaModuleRelease。按慣例這是最佳做法。
  2. 外鍵每默認使用模型ID。因此,您應該將您的相關列命名爲模型本身。在MetaModule中,您應該將modulename重命名爲module
  3. 您不需要列的過度描述性名稱。 Module.modulename是多餘的信息。 Module.name已經足夠且更具可讀性。同樣適用於像moduleversionversion)或releasenumbernumber)這樣的屬性。
+0

好的,謝謝。對於我寫的解決方案還有什麼建議?那是對的嗎? – abhi3389

1

這大多看起來是正確的,但release.metmodules應該是ForeignKey,而不是ManyToManyField。當您聲明ManyToManyField時,Django會在幕後創建一個新表來保存這兩個表之間的關係。

在你的情況這意味着release將只包含releasenumbernotes領域,將有第四臺舉辦metamodulerelease之間的關係。要匹配您顯示的結構,只需使用ForeignKey即可。

要考慮的另一件事是數據是否有其他限制。

  • modulename是否唯一?然後添加unique=True
  • 是和modulenamemetamodule表中唯一的組合嗎?如果是這樣,請使用unique_together
  • metamodulesreleasenumber相似。

我也同意@Alp對命名的評論。

+0

由於記錄正在返回多條記錄,我使用ManyToManyField for Release.metamodules。我正在導入一個csv文件到Release中的ManyToManyField,我收到了下面的錯誤。 回溯(最近呼叫的最後一個): 文件「」,第5行,在 文件「/ usr/local/lib/python2。7/site-packages/django/db/models/base.py「,第416行,在__init__中 raise TypeError(」'%s'是該函數的無效關鍵字參數「%list(kwargs)[0]) TypeError:'metamodules'是這個函數的一個無效關鍵字參數 – abhi3389

+0

@ user3818325:好吧,就像我說過的,如果你的表按照你描述的方式構造,你就不能在那裏使用'ManyToManyField'。在你的表中沒有'metamodules'字段Django反而必須創建一個全新的表來保存這個關係 –

+0

@ Kevin Christopher Henry:好的,如果我使用ForeignKey,在csv文件導入期間它返回多於1條記錄,我無法將數據導入到字段中如何處理多個記錄導入到此字段中? – abhi3389