2011-12-07 3 views
0

=== 모델 ===및 필드 조회

class A(models.Model): 
    name= models.CharField(max_length=20, blank=False) 

Class B(models.Model): 
    university = models.CharField(max_length=25, blank=False) 
    location = models.CharField(max_length=30, blank=False) 
    b_fk= models.ForeignKey(A) 

Class C(models.Model): 
    studentclass = models.CharField(max_length=10, blank=False) 
    section = models.CharField(max_length= 10) 
    c_fk = models.ForeignKey(B) 

class Cfurther(models.Model): 
    branch= Models.CharField(max_length=15, blank=Flase) 
    number = models.IntegerField() 
    cfur_fk = models.ForeignKey(C) 

class Info(models.Model): 
    info_number = models.IntegerField() 
    info = models.CharField(max_length= 12, blank=Flase) 
    info_fk = models.ForeignKey(B, related_name= "info_set") 

class Infocategory(models.Model): 
    find = models.CharField(max_length=15, blank=False) 
    cat_fk = models.ForeignKey(Info) 

class Extra(models.Model): 
    extrainfo = models.CharField(max_length=30) 
    extra_fk = models.ForeignKey(Infocategory) 

=== 보기 ===

장고 문서

반환 자동적으로 외래 키 012를 추종하는 QuerySet 이 쿼리를 실행할 때 해당 추가 관련 데이터를 선택합니다.

select_related는 외래 ​​키 과 일대일 관계로 단일 값 관계로 제한됩니다.

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

I (모든 관계는 일대 있습니다) 모델 필드를 가져 검색어 세트에 따라 작성한

myquery = Info.objects.select_related().filter(info_number__iexact = 123) 
  • 나는 방향으로 정보 모델에서 통과 할 상단 및 하단 모델
  • 가져 오는 데 문제가 없습니다 클래스 A 템플릿에 select_related()가있는 레코드가 있지만 은 내 사례 (클래스 B, C, Cfurther, 정보 카테고리, 추가)에서 select_related로 모든 모델 필드를 가져올 수 있습니까?
  • 그렇지 않다면 새로운 쿼리 세트를 만들어야합니까? 또는 select_related()가 작동합니까?

는 나는 조금 방금 표준 장고 API를 통해 원하는

답변

4

당신은 깊은 모든 관계를 통해 통과 할 수 select_related 필드 조회에 대한 혼란. select_related은 관계 설정에 특별한 작업을 수행하지 않습니다. 단지 액세스 할 때 각 외래 키를 찾는 대신 사전에 조인을 수행하여 DB 쿼리의 수를 줄일 수 있습니다.

그러나 문서 상태로 select_related은 외래 키 및 OneToOneFields에서만 작동합니다. ManyToManyFields에서는 전혀 작동하지 않습니다. 또한 OneToOneField 인 경우에만 select_related과 역 관계를 수행 할 수 있습니다. Reverse ForeignKeys는 지원되지 않습니다. 마지막으로 select_relatednull=False의 필드 다음에옵니다. 그것은 NULL-수있는 필드가 있다면, 당신은 명시 적으로 따라 select_related을 알려야합니다 :

SomeModel.objects.select_related('some_nullable_field') 

장고 1.4 명중 후에는 select_related처럼 작동하지만 ManyToManyFields을 지원하고 역 prefetch_related라는 새로운 방법에 액세스 할 수 있습니다 외래 키 관계.

+0

방금 ​​언급 한 내용을 반복했습니다. 나는 해결책보다는 오히려 문서를 찾고있다! – thchand

+0

해결책은 문서입니다. 역 외래 키나 다 대 다를 따르지 않는 한 원하는대로 'select_related'할 수 있습니다. 뭐가 문제 야? –

관련 문제