2016-06-30 79 views
0

我想在Django中使用建立一個SQL數據庫。我從抽象的角度理解模型,但我不知道如何構建數據庫以瞭解是否正確地關聯這些對象。我想保留這個摘要,以便我可以自己實現代碼。複雜的Django模型關係

說我有三種類型的對象:ABCA可容納一個或多個B。 A B可以以任意組合存儲多個BC,但它必須至少包含一個(BC)。 A C僅保存一些數據,並且是一個簡單的構造。

目前我有:

from django.db import models 

class A(models.Model): 
    # A attributes 

class B(models.Model): 
    a = models.ForeignKey(A, on_delete=models.CASCADE) 
    # B attributes 

class C(models.Model): 
    b = models.ForeignKey(B, on_delete=models.CASCADE) 
    # C attributes 

我知道,這只是允許之間CBBA一個多到一的關係,但我不知道如何讓一個B指到另一個B

我也希望能夠很容易地寫出一個表格,其中您首先需要至少一個BA,並且您可以隨意添加或刪除B s。這可能嗎?

我認爲可能只是設置這些數據的一種更好的方法,但我沒有看到它,因爲我對數據庫組織非常陌生。


如果有幫助,我正在設計一個表格,以便於編寫游泳訓練。 A是一個鍛鍊,它有一個標題和一個作者。每個B是一組。套件由諸如「2x50碼自由泳」或「2點上的8x100 IM」 - C s組成。但是有時候一個集合有一個子集,就像一個循環。

回答

1

我強烈建議檢查出的模型Django文檔可以在這裏找到:Django Models

此外,做一個對稱的多對多的關係,使用:

class B(models.Model): 
    bs = models.ManyToManyField("self") 

此外,我建議做A和B之間的關係是多對多關係而不是外鍵。這將允許您將B分配給多個A,同時仍允許1 A擁有多個B。 B和C可能會採用相同的邏輯。

要回答您提出的有關使B成爲A所需的問題,我不認爲這是可能的。看看這個問題的更多信息:Django 1.7: how to make ManyToManyField required?

+0

啊,好的。這些都是很好的建議。我會檢查一下。然而......我很好奇A和B的關係是多對多的。如果Bs由他們的主鍵(一個數字)來標識,我什麼時候會看到多個As是指同一個B? –

+0

如果您具有可用於2種不同鍛鍊的相同組合,則只需創建1個數據庫條目。多對多的關係允許這樣做,而一個外鍵會要求你在每次你想把它添加到一個新的鍛鍊中時創建一個新的相同的條目 – Written

+0

嗯好吧,但數據庫如何確定它們是一樣?作爲一個用戶,你不會選擇預先存在的集合(儘管...也許這可能是一個功能,但它並不打算)。我想象的方式是:有人會填寫一張表格來編寫鍛鍊,然後鍛鍊將張貼給其他人閱讀。鍛鍊不可能很容易被編輯或重複使用。 (我不是想說我不喜歡你的建議,我只是不知道我們的想法是否排隊!) –