2016-06-22 1 views
2

내 장고 앱에 준결정 모델 관계가 있습니다.ManyToMany를 통해 장고의 복잡한 모델을 올바르게 사용하기

나는 그룹이 많은 업체 (사람)도있을 수 있습니다 그래서

많은 지역 을 할 수있는 그룹 (사업을)이있다. 문제는 공급자가 그룹 위치를 통해 특정 그룹에 연결되어 있다는 것입니다. 즉 공급자가 그 위치를 가질 수 있습니다. 실제로 제공자는 여러 위치 (여러 그룹에 속함)를 가질 수 있다고 생각합니다. 내 그룹 (및/또는 공급자) 모델

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 그룹에서 공급자와 공급자의 목록을 얻을 수있는에 어느. 나는 여전히 장고의 관계 시스템을 배우고 있기 때문에 이러한 관계를 잘 작동시키는 방법에 대한 건설적인 비판이 도움이 될 것입니다.

답변

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

관련 문제