2009-05-20 6 views
5

"다"클래스에 다 대일 필드를 정의하려고합니다. 예를 들어, 사용자가 한 그룹의 구성원 만 될 수있는 상황을 상상하지만 그룹이 많은 사용자를 가질 수 있습니다Django의 ManyToOneField

class User(models.Model): 
    name = models.CharField() 

class Group(models.Model): 
    name = models.CharField() 
    # This is what I want to do -> users = models.ManyToOneField(User) 
외래 키와 같은 사용자 모델의 그룹 필드를 정의하는 말할 것이다

장고 문서,하지만 그룹 모델에서 관계를 정의해야합니다. 내가 아는 한, ManyToOneField가 없기 때문에 ManyToManyField를 사용하지 않아도됩니다.

+0

ForeignKey를 사용할 수없는 이유는 무엇입니까? –

+2

기존 프로젝트를 진행하고 있으며 기본 프로젝트가 계속 업데이트되는 기본 모델을 변경하고 싶지 않습니다. – vacanti

답변

8

ManyToOne 필드는 귀하가 짐작했듯이 장고에서는 ForeignKey입니다. 당신은 논리가 제대로 작동하기 위해 User 클래스를 정의해야하지만 장고는 자동으로 Groups 모델에 역 속성을 사용할 수있게됩니다

class Group(models.Model): 
    name = models.CharField(max_length=64) 

class User(models.Model): 
    name = models.CharField(max_length=64) 
    group = models.ForeignKey(Group) 

g = Group.objects.get(id=1) 
print g.user_set.all() # prints list of all users in the group 

장고의 모델은 관계형 데이터베이스의 위에 앉아 있음을 기억하십시오. .. 두 개 이상의 외래 키 (즉, M2M이없는)를 가리키는 테이블에서 단일 FK 필드를 정의 할 수있는 방법이 없으므로 그룹 개체에 ManyToOne 관계를 배치하는 것이 기본 데이터 저장소에 매핑되지 않습니다. 원시 SQL을 작성했다면,이 관계를 그런 식으로 생각하는 데 도움이된다면,이 관계를 사용자 테이블에서 그룹 테이블로의 외래 키로 모델링 할 수 있습니다. 그룹 인스턴스에 정의 된 ManyToOne 속성을 사용하는 구문과 논리는 그러한 개념이 존재하는 경우 사용자에 정의 된 ForeignKey보다 훨씬 간단합니다.

+1

내가 찾고있는 것을 할 수없는 이유를 설명해 주셔서 감사합니다. 나는 많은 분야에서 많은 분야를 사용할 것입니다. – vacanti

1

사용자 구성이 내장 인증 시스템이라고 가정하면 ... 일부 종류의 프로필 모델을 작성하고 대신 OneToMany 필드를 첨부하는 것이 좋습니다. 그런 다음 hook the Profile model to the user model 수 있습니다.

1

당신은 아마 단순히 역방향 조회에 내장하여보고해야합니다

group = Group.objects.get(id=1) 
users_in_group = group.user_set.all() 

역방향 조회 세트는 자동으로 해당 모델에 대한 외래 키 또는 다 대다 관계를 만들어집니다.

당신이 우호적 이름이 참조하거나 반환하기 전에 추가 필터링을 제공하려면, 당신은 항상 방법의 호출 래핑 할 수 있습니다

class Group(models.Model): 
    name = models.CharField(max_length=64) 

    def users(self): 
     return self.user_set.all() 

하나는 템플릿에서 호출 할 수 있습니다 :

{{ group.user_set.all }} 

{{ group.users }} 
+0

감사! 이것은 Group 클래스의 ManyToMany 필드와 함께 사용하는 것입니다. – vacanti