2011-08-03 27 views
1

我正在爲我的新django網站創建一個用戶配置文件類,並且正在嘗試確定如何在我的模型中表示用戶的物理地址。你如何決定創建一個新的模型與Django中的字段?

是更好的做法是創建模型的一個新的子類,並與像

class UserProfile(models.Model): 
    ... 
    address = models.OneToOneField(AddressModel) 
    ... 
class AddressModel(models.Model) 
    street_address = models.CharField(max_length=30) 
    city = models.CharField(max_length=15) 
    .... 

一個OneToOne鍵引用它或者是它最好創建一個新的地址欄像

class UserProfile(models.Model): 
    ... 
    address = AddressField(location_dict) 
    ... 
class AddressField(models.Field) 
    # details go here 
    ... 

回答

4

我一般如果可能獨立創建條目,發現有單獨的模型是有用的。例如,如果您最終可能會收集到一組地址和一組用戶,但並非所有用戶都會立即關聯,那麼我會將他們分開。但是,如果數據庫中的所有地址都會始終立即與用戶相關聯,那麼我只需在該模型中添加一個新字段即可。

注意:有些人會告訴你,有空的數據庫列是錯誤的和邪惡的,因此,如果你的任何地址永遠是None,你應該有一個單獨的模型。我不同意;雖然通常有很多很好的理由來避免可空列,但在這種情況下,我並沒有發現檢查空地址帶來的麻煩,而是比檢查是否存在一對一模型條款更麻煩。

3

就像Eli說的那樣,這是一個獨立的問題。對於這個特定的例子,我會將地址設置爲UserProfile的字段,但前提是您希望每個用戶有一個地址。如果每個用戶可能有多個地址(例如家庭地址和假期地址),那麼我會建議使用ForeignKey設置模型,該模型建立多對一關係。

class UserProfile(models.Model): 
    ... 

class AddressModel(models.Model) 
    user = models.ForeignKey(UserProfile) 
    street_address = models.CharField(max_length=30) 
    city = models.CharField(max_length=15) 
    location = models.CharField(max_length=15) #"Home," "work," "vacation," etc. 

然後可以創建許多AddressModel對象並將其與每個UserProfile關聯。

+1

這種關係不會與人們所期望的相反。在你的例子中,每個用戶只能有一個地址,但是一個地址可以屬於許多用戶。我希望它是相反的。 – richardolsson

+0

糟糕!謝謝,修復。 – stillLearning

1

爲了回答你的問題,我想說一般情況下,最好將其他用戶提到的地址分開。

我認爲你對數據庫規範化的瞭解越多,這個問題就越容易回答。

這篇文章Using MySQL, Normalisation應該幫助你弄清楚規範化「形式」的基礎知識。順便說一句,即使它的名稱是MySQL,它對於關係數據庫來說確實非常通用。

雖然你並不總是需要通過所有項目的所有常規形式,但瞭解它真的有幫助。

相關問題