2010-07-07 67 views
0

我是django的新手。 我有兩個簡單的對象,我們可以稱它們爲 - 文件和文件組: - 一個文件組可以容納一個文件列表,根據'訂單'字段排序。 - 每個文件可以與多個組相關聯。單向一對多和多對多可能在django

所以基本上,分貝表將是:1 )文件 ,其具有除FK到文件和文件組命名爲「順序」第2列)File_Group 3)File_Group_Mapping表。

有一個多一對多的關係在這裏,但文件對象不應該是知道存在該文件組的(對我來說沒有任何意義)

我的問題的 - 是有沒有辦法在這裏創建一個單向的多對多/一對多的關係?我如何用django建模?

我找不到通過django使其成爲單向的方法。 我看到一個使用類似的解決方案 -

class FileGroup(...): 
    files = models.ManyToManyField(File, through='FileGroupMapping') 

,但這樣會使文件對象知道文件組。

我也可以通過映射表File_Group_Mapping做到這一點的模型文件中像這樣 -

class FileGroupMapping(...): 
    files = models.ForeignKey(File) 
    groups = models.ForeignKey(FileGroup) 
    order = models... 

什麼是做到這一點通過Django的最佳方法是什麼?

謝謝

回答

1

您的兩種方法是相同的。在幕後,Django creates a lookup table for a ManyToManyField。從ORM的角度來看,您可以將ManyToManyField放在任一型號上,儘管它在管理員中有所不同,並且您希望使用「limit_choices_to」選項。使用'through'可以將列添加到查找表中以進一步定義兩個模型之間的關係,這正是您通過手動創建查找表完成的。

無論哪種方式,您仍然可以'獲取'特定文件所屬的文件組,因爲Django查詢集將雙向遵循FK關係。

+0

謝謝。有沒有辦法讓它變成單向的? 我和Hibernate一起工作了好幾年,真的很喜歡他們的雙向/單向關係方法。我在django中找不到類似的方法。 – Liz 2010-07-07 13:47:01

+0

我不認爲這個概念真的適用於Django。無論您使用的是什麼架構,這看起來都是非常標準的M2M關係。你關心的是什麼? – 2010-07-07 15:56:43

+0

我擔心的是,在我的應用程序邏輯中,文件不應該知道文件組的存在 - 所以我想避免雙向關係。這不是一個技術問題,而是一個概念。 – Liz 2010-07-08 06:40:11

3

我也是一個休眠用戶。我完全理解你在找什麼,只要在你的多對多關係中嘗試使用屬性「symmetrical = False」,這會使關係變得單向。

class FileGroup(models.Model): 
    files = models.ManyToManyField(File, symmetrical = False) 

這應該是訣竅!

+0

謝謝,你救了我的一天。 – 2016-04-26 02:17:58