2013-07-05 48 views
0

我需要創建一個模型以包含與兩個獨立模型相關的一組數據,並且這兩個模型的組合是唯一的。包含與Django中的兩個模型相關的信息

例如,假設我有一個用戶Profile模型和一個Dessert模型。 Profile模型包含用戶的偏好和個人信息,Dessert模型包含有關甜點(卡路里,成本,類型等)的信息。我現在想創建一個模型,讓用戶記錄給定甜點的「味覺測試」結果。每個用戶都可以對每個甜點進行味道測試,但只有一個(即,每個用戶/甜點組合的味道測試是唯一的)。

我該如何做到這一點? through(如此處所述:How do you bind a model to two other, already related models, and display the information?)似乎並不合適,因爲大部分時間我都想在沒有味覺測試的情況下訪問甜點或用戶的個人資料(例如,顯示有關甜點的信息並將其與其他信息進行比較甜點)。 through會增加很多不必要的開銷。

我能拿出最好的解決方案是創建一個「TasteTest」模式,像這樣:

class TasteTest(models.Model): 
    user_profile = models.ForeignKey(Profile) 
    dessert = models.ForeignKey(Dessert) 
    # Taste test results here 

我有兩個相關的問題。首先,這是做這件事的最好的/正確的方法嗎?或者,還有更好的方法?其次,查找時涉及的數據庫開銷是多少?要訪問口味測試給定用戶在給定的甜點好像我必須這樣做:

user.profile.tastetest_set.get(dessert=given_dessert.pk)` 

這似乎是它可以是一個昂貴的查找(雖然我與DB真的不熟東西,這就是爲什麼我問)。

+1

我個人從未發現沙子特別好吃。其他人可能會不同意,但... –

+0

@ IgnacioVazquez-Abrams你顯然從來沒有嘗過萬寶龍撒哈拉選擇'84那麼。呃......這是漫長的一天,謝謝。 –

回答

1

through表格的多對多關係在這裏是正確的方法。

https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

在幕後,Django會創建一箇中間表的許多到許多領域,無論如何,所以不必擔心額外的開銷上查找是不必要的。沒有辦法繞過它。

+0

感謝您的回覆,抱歉遲遲不能回覆您。我有幾個跟進問題。如果我使用'through',那麼會爲每個可能的用戶/大學組合創建一箇中間表(對不起,不知道這是否合適)。如果是這樣,那將意味着很多新的數據庫內容,特別是當可以有任意多的用戶和1000多個沙漠時。如果是這樣的話,這是一個性能問題嗎?第二,我目前在輪廓和沙漠模型之間使用'ManyToManyField'來包含最喜愛的沙漠列表。這應該轉移到通過? –

+0

有一個爲整個關係創建的中間表,而不是每個組合中的一個。該表格將爲用戶的PK列和甜點PK的列添加任何「品嚐測試」結果。性能取決於您的數據庫,但通常不是問題。對於最喜歡的問題 - 可能,但它不是嚴格要求。這樣做可以避免一些冗餘。 –