그것은 장고의 공식 문서에서의 : https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationshipsdjango : 다 대 다 관계의 추가 필드에 검은 마법이 있습니까?
모델 같은있다 : 결국
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)
, 그것은 그러한 예이다 : 사람 모델 인식 방법
# Find all the members of the Beatles that joined after 1 Jan 1961
>>> Person.objects.filter(
... group__name='The Beatles',
... membership__date_joined__gt=date(1961,1,1))
[<Person: Ringo Starr]
내 질문은 그룹 및 구성원 속성은 정의되어 있지 않으므로 그것은 단지 많은 사람들의 마술인가? 아니면 장고에서 보편적 인 것입니까?
내가 같은 쿼리를 달성한다면, 나는 다음과 같은 생각 코드 (장고의 ORM의 관점에서가 아니라 비즈니스 하나에서) 더 자연스러운 :
Membership.objects.filter(group__name='The Beatles', date_joined__gt=date(1961,1,1))).select_related('person')
편집 내가 다시 문서를 읽고 할 그러한 거꾸로 발견하는 것은 보편적이다. 단락 https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships에는 다음과 같이 표시됩니다.
역방향으로도 작동합니다. "역"관계를 참조하려면 모델의 소문자 이름 만 사용하십시오.
이전에이 역방향 쿼리를 사용한 적이 없습니다. 그래서 처음으로 그것을 보았을 때, 그것은 내 두뇌를 두드렸다. 죄송합니다.이 스레드는 어리 석다는 것이 밝혀졌습니다. 그러나 그 단락에서 매우 (얇은) 줄을 건너 뛰는 사람들에게 도움이되기를 바랍니다.
밴드는 뮤지션 모델에 정의 된 외래 키이므로 예제를 완전히 이해할 수 있습니다. 하지만 내 질문에, Person 모델은 person 속성이 정의되어 있지 않습니다. 내 질문에 답하기 위해 Band.objects.filter (musician__name = 'Ringo Starr')와 같은 반대의 작업을 수행하는 것이 가능한지 알려주십시오. –
그것은 동일한 필수 메커니즘입니다. django ORM은 장고 쿼리를 SQL로 변환합니다. 나는 예제로 편집 할 것이다. –
설명해 주셔서 감사합니다. 나는이 문서를 다시 읽고 역방향 질의가 가능하다는 것을 깨달았다. 그러나 그것은 한 줄의 것입니다. 그래서 나는 내 눈이 그것을 건너 뛴 것 같아. –