2009-09-09 3 views
1

를 통해 모든 개체를 선택 마십시오어떻게 모델을 감안할 때 관계 모델

class Profile(models.Model): 
    user = models.ForeignKey(User, unique=True) 

class Thingie(models.Model): 
    children = models.ManyToManyField('self', blank=True, symmetrical=False) 

class Relation(models.Model): 
    profile = models.ForeignKey(Profile) 
    thingie = models.ForeignKey(Thingie) 

어떻게 주어진 거시기와 관련된 모든 정보 인스턴스를 포함하는 검색어 세트를 반환? 즉, 관계로부터 주어진 외계인을 가리키는 외래 키를 가진 모든 프로필입니다.

나는 select_related()에 대해 모두 알고 있고 iterating을 통해이 작업을 수행하는 방법을 알고 있지만 반복적으로 짜증나는 (badoop bah!) 코드를 찾습니다. 또한 values_list()를 살펴 보았지만 올바르게 작동하지는 않습니다.

도와주세요! 감사!

+0

어? 프로필과 관계의 관계는 무엇입니까? Relation과 Thingie의 관계는 무엇입니까? GrooveUser 및 Media 란 무엇입니까? 귀하의 질문을 간단하고 의미있는 양식으로 추출하십시오. – ozan

+0

내 실수로, 실수로 단순화 된 스 니펫/예제 코드 대신 실제 코드를 남겼습니다. 고침, 고마워! – neuman

답변

2

확실히 queryset이 ​​필요합니까? 지능형리스트가 반복하는 자극으로 간주하는 경우

profiles = [r.profile for r in thingie.relation_set.all()] 

내가 잘 모르겠지만, 나에게이 완벽하게 직관적 인 파이썬 방법입니다 : 당신은 단지 반복 가능한 것으로 필요한 경우, 목적에 대한 간단한 식입니다 . 물론 당신이 그것의 검색어해야하는 경우, 당신은 예를 들어, 두 개의 쿼리와 함께 뭔가 지저분 할 겁니다 :

relation_values = thingie.relation_set.all().values_list('pk', flat=True) 
profiles = Profile.objects.filter(relation__in=relation_values) 

더에 대해 "in"설명서를 참조하십시오. 당신이 질문 모음을 필요로하지 않는다면 나는 첫 번째 접근법을 선호합니다. 아, 서로 다른 프로파일 만 원할 경우 첫 번째 방법에서는 set(profiles)을 사용하거나 두 번째 방법에서는 distinct() 쿼리 셋 방법을 사용할 수 있습니다.

+0

리스트 이해력은 확실히 잘 작동하지만 OP는 iterating에 대해 불평하고 있습니다 (이것은 기본적으로리스트 이해력입니다) ... –

0

Django 문서를 Making queries에서 읽었습니까? 그것은 당신이 원하는 것을 성취하는 간단한 예를 가지고 있습니다.보다 구체적으로는 Lookups that span relationships입니다. 후자의 링크에있는 코드 스 니펫을 페이지 시작 부분의 모델 코드로 참조하십시오.

+0

예 문서를 끝까지 여러 번 읽었습니다. 그러나, 나는 관계 정보 (IE : 나를 발견하는 모든 Thingies whereie.profile.user = X)가 아닌 실제 인스턴스 (IE : Find all all.profiles where relation.thingie = 와이). – neuman

0

프로필과 Thingie 사이에 직접적인 관계를 정의하지 않으면 그렇게 할 수 없습니다.

ManyToMany를 Profile을 가리키는 Thingie에 추가하고 ManyToMany에 through 인수 (django docs)를 사용하여 관계 모델/테이블을 지정하는 것이 가장 좋습니다.

그런 식으로 Thingie에서 직접 필터 작업을 수행하여 프로필을 가져 와서 중간 관계 데이터를 저장할 수 있습니다.

+0

장고 모범 사례에 더 가깝기 때문에 이것을 사용하게 될지도 모르지만 위의 대답 중 두 번째 부분이이 질문에 대해 더 정확하다고 느꼈습니다. 감사! – neuman