2016-06-22 24 views
2

我有一個半複雜的模型關係在我的Django應用程序。使用ManyToMany通過正確的複雜模型在Django

我有一個集團(公司),它可以有很多地方 所以

一個組可以有許多供應商(人)爲好。問題是,提供者通過組地點連接到特定的組。這就是說供應商可以擁有那個位置。實際上,我相信一個提供者可以有很多位置(屬於多個組)。我在Django的有這到目前爲止,我不認爲正確的方法是這樣的:

class GroupLocations(models.Model): 
    address_id = models.ForeignKey(Address, on_delete= models.SET_NULL) 
    group_id = models.ForeignKey(Group, on_delete=models.SET_NULL) 
    doing_business_as = models.CharField(max_length = 255) 
    created_at=models.DateField(auto_now=false, auto_now_add=true) 
    updated_at=models.DateField(auto_now=true, auto_now_add=true) 

class ProviderLocations(models.Model): 
    provider_id = models.ForeignKey(Provider, on_delete=models.CASCADE) 
    group_location_id = models.ForeignKey(GroupLocations, on_delete=models.CASCADE) 
    created_at=models.DateField(auto_now=false, auto_now_add=true) 
    updated_at=models.DateField(auto_now=true, auto_now_add=true) 

我的問題是,是否我的組(和/或供應商)模式需要有某種關係的規定在他們的模型定義?

class Group(models.Model): 
    group_name = models.CharField(max_length=50) 
    group_contact= models.CharField(max_length=50) 
    #do I need something like the following: 
    providers = models.ManyToMany(Provider, through='ProviderLocations') 
    provider_locations = models.ManyToMany(Group, through='GroupLocations' 


class Provider(models.Model): 
    created_at=models.DateField(auto_now=false, auto_now_add=true) 
    updated_at=models.DateField(auto_now=true, auto_now_add=true) 
    groups = models.ManyToManyField(Group, through='GroupLocations') 
    group_locations = models.ManyToMany(GroupLocations, through='ProviderLocations') 

這是這樣我就可以從供應商獲得組的列表,以及組位置 ,我可以從一組供應商和供應商的名單locations.Actually更喜歡的位置加入其中哪一個。我仍然在學習Django'ss關係系統,所以對如何使這些關係在一起工作的任何建設性批評都會有幫助。

回答

1

我的問題是,是否我的組(和/或供應商)模式需要有 某種關係,在他們的模型定義規定?

是一對多的關係。而且你只需要爲一個模型或另一個模型定義它,因爲可以在兩個方向上遍歷多到多個模型。

多對多關係的兩端可以通過自動API訪問另一端的 。 API的工作原理與上面的「向後」一對多關係一樣。

唯一的區別是在屬性命名:定義 的ManyToManyField使用該場本身的屬性名稱的模型, 而「反向」模型使用 原始模型的小寫型號名稱,加上「_set '(就像反向一對多 關係)。

來源:https://docs.djangoproject.com/en/dev/topics/db/queries/#many-to-many-relationships

因此你的模型可以簡化。

class Group(models.Model): 
    group_name = models.CharField(max_length=50) 
    group_contact= models.CharField(max_length=50) 

    providers = models.ManyToMany(Provider, through='ProviderLocations') 


class Provider(models.Model): 
    created_at=models.DateField(auto_now=false, auto_now_add=true) 
    updated_at=models.DateField(auto_now=true, auto_now_add=true) 

我不明白爲什麼你試圖同時創建GroupLocationProviderLocation模型。我相信他們可以合併。

+0

你可能是對的,我不得不重新考慮這個。我不確定該小組如何通過這些位置查看提供商(因爲它們是通過group_locations連接的)。我相信我認爲這種分離的原因是......提供者可能是一個組的一部分,但在特定的位置。因此,如果我明白了這一點:提供者將通過提供者位置(它有一個組位置,這是它如何返回組)的一部分,從上面的一行開始工作?或者是你在提供商位置和組位置上詢問的內容? – Codejoy

+0

是的,這正是ProviderLocation或GroupLocation模型爲您提供的。兩者都意味着冗餘。 – e4c5

+0

改變了我的評論。 – Codejoy