2012-07-26 41 views
1

我在理解Django中的多對多字段時遇到了一些麻煩。如何定義多對多表格

當我創建了一個多到許多領域,例如:

class GlobalPart (Models.model): 
    ... 
    category_id=models.ManyToManyField(Category, related_name = 'globalpart') 
    ... 

class Category (Model.model): 
    ... 
    category = models.CharField(max_length=250) 
    ... 

我注意到,它創造了一個新的表,除了叫appname_globalpart_category_idappname_globalpart表的GlobalPart模型。

我想知道的是,如何定義該表中的字段類型。我認爲 應該至少有一個外鍵來關聯字段。但取而代之的是表的主鍵,其他字段是整數(globalpart_idcategory_id)。

所以我的問題是 - 這是正常的嗎?還是我以某種方式錯誤地定義了多對多字段?而我的下一個問題是,我將如何獲得與特定GlobalPart關聯的所有category_ids

回答

1

(1)簡答:是的,這是正常的。

長答案:ManyToMany表需要一個外鍵給Category和GlobalPart表。嚴格地說,這兩個外鍵應該是足夠的。你在那裏看到的額外的pk只是爲了django魔術。如果您自己手動定義多對多表,那麼只能使用該表中的這兩個外鍵。但是,如果你讓Django的爲你做它(通過使用ManyToManyField),你得到這個額外的PK

(2)我建議改變模型的領域CATEGORY_ID至類別:

class GlobalPart (Models.model): 
     categories=models.ManyToManyField(Category, related_name = 'globalpart') 

這是因爲,ManyToManyFields指好到「許多」項目。本欄位不涉及「one」category_id,它指的是全部相關類別。因此,在命名時相應地命名它是很自然的。

至於訪問所有類別,你可以通過訪問「類別」屬性來做到這一點。說,如果你的對象實例名爲global_part,您可以訪問的類別是這樣的:

categories = global_part.categories.all() 

而是所有(),你可以使用過濾器()或排除()查詢您模型時,使用同樣的方式。

這是有關的鏈接django docs

1

你認爲外鍵是什麼?它是一個包含值的字段,這些值等同於「外部」表中的ID(通常是主鍵)。如果其他表具有整數鍵,就像大多數Django表所做的那樣,那麼外鍵字段也將是integer類型。

此外,Django創建約束,以便數據庫強制ID確實在外表中引用有效值。根據您的數據庫,這些可能會或可能不會顯示爲字段定義的一部分。