2010-01-05 4 views
15

중간 모델 용 Django 문서에 설명 된대로 Person Group 및 Membership을 만듭니다.Django 중간 모델의 필드에 액세스하십시오.

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
    return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __unicode__(self): 
    return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

그것은을 가진 그룹 개체에서 사람을 액세스 할 수 있습니다 :

>>>Group.members.name 

합니까 장고가 사람을 가져올 또 다른 조회를 작성? 그룹 개체에서 date_joined 필드에 액세스 할 수 있습니까?

제가 가진 사람 이름 필드를 얻을 것으로 예상 것입니다 혼란 것은 :

사람이 필드 '이름'도 중간 모델을 사용하면 어떻게됩니까
>>>Group.members.person.name 

이 필드가 '이름 '.

답변

29

예제의 members 필드는 ManyToManyField이므로 한 사람이 아닌 많은 사람들에게 액세스 할 수있는 방법입니다.

>>>print my_group.members 
<django.db.models.fields.related.ManyRelatedManager object at 0x181f7d0> 

see the documentation을 관리자가 무엇인지 더 잘 이해하려면 다음 멤버 필드 아래 목적은 실제로 관리자의 특별한 유형이 아닌 사람이다.

는 예를 들어 할 것 사람의 이름을 액세스하려면 :

>>>for person in my_group.members.all(): 
>>> print person.name 

당신은 멤버 필드에 관리자를 통해 회원 모델의 필드에 액세스 할 수 없습니다. 그것의 필드에 액세스하기 위해 당신이 할 것 :

>>>for membership in my_group.membership_set.all(): 
>>> print membership.date_joined 

그래서 당신이 당신의 회원 모델에 이름라는 필드가 있다면, 당신은 이런 식으로 접근합니다 :

>>>for membership in my_group.membership_set.all(): 
>>> print membership.name 

두 번째 방법을 사람의 이름에 액세스하는 것 : 관리

>>>for membership in my_group.membership_set.all(): 
>>> print membership.person.name 

희망 조금 :)

+0

당신이 말하는 것은 완벽한 의미가 내가 장고의 모델을 이해하는 방법을 맞습니다. 나를 혼란스럽게 한 것은 http://docs.djangoproject.com/en/1.0/topics/db/models/#extra-fields-on-many-to-many-relationships의 intemedaite 모델에 대한 django 문서입니다. 그들은 위의 동일한 모델 : # 이름이 'Paul'으로 시작하는 멤버가있는 그룹 찾기 >>> Group.objects.filter (members__name__startswith = 'Paul') [<그룹 : The Beatles>] 나는 그것은 : >>> Group.objects.filter (members__person__name__startswith = 'Paul') – pablo

+0

회원이 Manager이기 때문에 "Group.objects.filter (members__name__startswith = 'Paul')"입니다. 회원은 Membership 객체가 아니라 ManyRelatedManager 객체라는 사실을 이해해야합니다. 관리자가 정확히 무엇인지 자세히 읽으면 도움이 될 것 같습니다. 추신해당 모델이있는 프로젝트에 "python manage.py shell"을 입력하면 "Group.objects.filter (members__person__name__startswith = 'Paul')"을 입력하고 어떤 일이 일어날지를 볼 수 있습니다 - 어쩌면 도움이 될까요? –

+0

회원이 관리자이고 관리자에 대해 읽음을 이해합니다. 회원들이 그룹의 이름이 아닌 개인의 이름을 사용하는 방법을 어떻게 이해하는지 모르겠다. 둘 다이 분야를 가지고 있습니다. 멤버쉽에는 필드 이름이있을 수도 있습니다. 나는 이것을 걸러 낼 것인가? – pablo

4

사용하는 데 도움이 회원 클래스의 R : 대신

MyGroup.membership_set.all() 

:

MyGroup.members.all() 
관련 문제