2014-03-27 72 views
0

由於Django將每個模型映射到一個表。我無法在我的代碼中創建軟件包。在哪裏我可以包裝課程的一些部分,使其更加合乎邏輯並增加耦合度。如何在Django模型中創建類

例如

class Employee(models.Model): 

    #personal information 
    first_name = models.CharField(max_length=20) 
    middle_initial = models.CharField(max_length=1) 
    last_name = models.CharField(max_length=20) 
    dob = models.DateField() 

    #job contract information 
    full_time = models.BooleanField() 
    hours_per_day = models.PositiveSmallIntegerField() 
    #.. and more 

我所試圖做的是

employee.job.is_full_time 
employee.job.get_hours_per_day 
# and more 

然而,這意味着我必須建立一個新的模式,它使用OneToOneField員工型號連接。我不想這樣做..加入數據庫是昂貴的。無論如何創造這樣的東西?

class Employee(models.Model): 

    class PersonalInformation: 
     first_name = models.CharField(max_length=20) 
     middle_initial = models.CharField(max_length=1) 
     last_name = models.CharField(max_length=20) 
     dob = models.DateField() 

    class Job: 
     full_time = models.BooleanField() 
     hours_per_day = models.PositiveSmallIntegerField() 
     #.. and more 

主要關鍵答案是創建一個包含多個類別,其會在數據庫映射到一個表的典範。

+0

那麼,這種模型方法並不適用於mongodb/nosql,因此您不能像這樣嵌套模型。如果你不想加入,你必須有一張桌子,所有東西都必須在同一個水平 –

+0

@AntoinePelisse至少它應該是一種將多個類映射到一個表的方法。這是任何系統分析和設計的基礎之一。 – Othman

回答

2

只有Django沒有辦法做到這一點。 Django模型代表平坦的關係數據庫。擴展模型框架以提供超出其後端能力的功能是不必要的,因此不在默認框架中實現。

有第三方軟件包提供你想要的,但據我所知,這些軟件包使用能夠使用這種數據結構的數據庫後端。

就我個人而言,我會與你的第一個例子,一個單一的平面模型,代表我所有的Employee數據。防止字段名稱中的任何歧義,並且在嵌套模型上使用平面模型將不會有任何花費。

還記得:不成熟的優化比聯合聲明要貴很多。

+0

使用連接+1。你可能應該從規範化開始,如果它能夠消除一些以後的異常(如果有人有兩個工作等等) –