python - uuidfield - 어떻게 장고 템플릿에서 다 대다 "통과"테이블의 속성에 액세스합니까?




django relationships (2)

장고 문서에서 ...

피자와 토핑을 믹싱하고 매칭하는 것과 같은 단순한 다 대다 관계 만 처리 할 때는 표준 ManyToManyField 만 있으면됩니다. 그러나 때로는 두 모델 간의 관계에 데이터를 연결해야 할 수도 있습니다.

예를 들어 음악가가 속한 음악 그룹을 추적하는 응용 프로그램의 경우를 생각해보십시오. 개인과 회원이 속한 그룹 간에는 다 대다 관계가 있으므로이 관계를 나타 내기 위해 ManyToManyField를 사용할 수 있습니다. 그러나 그룹에 가입 한 날짜와 같이 수집하려는 회원 정보에 대한 세부 정보가 많이 있습니다.

이러한 상황에서 Django는 다 - 대 - 다 관계를 관리하는 데 사용될 모델을 지정할 수 있습니다. 그러면 중간 모델에 필드를 추가 할 수 있습니다. 중간 모델은 throughTo 인수를 사용하여 중개자 역할을하는 모델을 가리키는 ManyToManyField와 연결됩니다. 뮤지션의 경우, 코드는 다음과 같습니다.

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)

이제 중개 모델 (이 경우 Membership)을 사용하도록 ManyToManyField를 설정 했으므로 이제 다 대 다 관계를 만들 준비가 된 것입니다. 중간 모델의 인스턴스를 생성하여이를 수행합니다.

ringo = Person.objects.create(name="Ringo Starr")
paul = Person.objects.create(name="Paul McCartney")
beatles = Group.objects.create(name="The Beatles")

m1 = Membership(person=ringo, group=beatles,
...     date_joined=date(1962, 8, 16),
...     invite_reason= "Needed a new drummer.")

m1.save()

beatles.members.all()
[<Person: Ringo Starr>]

ringo.group_set.all()
[<Group: The Beatles>]

m2 = Membership.objects.create(person=paul, group=beatles,
...     date_joined=date(1960, 8, 1),
...     invite_reason= "Wanted to form a band.")

beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]

출처 : http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

내 질문은 이러한 추가 특성에 액세스하기 위해 내보기와 템플리트를 설정하는 방법입니다. 밴드 페이지가 있고 밴드 이름을 표시하고 멤버십 레코드 및 표시 이름을 반복하고 date_joined를 원한다고 가정 해보십시오.

템플릿에 밴드 객체를 전달해야합니까? 또는 멤버십 객체를 어떻게 든 전달합니까?

그리고 템플릿에서 for 루프를 어떻게 만들 수 있습니까?

감사.


가장 쉬운 방법은 밴드를 템플릿에 전달하는 것입니다. 템플릿은 모델 간의 관계를 탐색 할 수 있으며 그룹의 구성원 및 membership_set 쿼리 세트 관리자가 있습니다. 그래서 여기에 내가 어떻게 할 것입니다 :

전망:

def group_details(request, group_id):
    group = get_object_or_404(Group, pk=group_id)
    return render_to_response('group_details.html',
                              {'group': group})

주형:

<h2>{{ group.name }}</h2>
{% for membership in group.membership_set.all %}
    <h3>{{ membership.person }}</h3>
    {{ membership.date_joined }}
{% endfor %}

유일한 해결책인지 아닌지는 잘 모르겠지만 관계 객체를 템플릿에 전달하는 것은 확실히 효과적입니다. 귀하의보기에서 Membership 개체의 QuerySet 가져 오기 :

rel = Membership.objects.filter( group = your_group ).select_related()

템플릿에 전달하면 {% for %} 사용하여 반복 할 수 있습니다.

{% for r in rel %}
     {{ r.person.name }} joined group {{ r.group.name }} on {{ r.date_joined }}<br />
{% endfor %}

select_related() 때문에 추가 쿼리를 수행해서는 안됩니다.





relationship