2012-08-23 2 views
0

주어진 공급자에 대한 모든 사용자의 목록을 가져와야합니다. 사용자는 여러 공급자를 가질 수 있으며 공급자는 여러 사용자를 가질 수 있습니다.다음 쿼리를 향상시키는 방법

나는 다음과 같은 테이블이 있습니다 :

class Provider(models.Model): 
    provider = models.CharField(max_length=100, primary_key=True) 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, primary_key=True) 
    provider = models.ManyToManyField(Provider, db_column='provider') 
내보기에서

:

providers = Provider.objects.order_by('provider') 

그리고 내 템플릿 :

{% for provider in providers %} 
<tr> 
    <td class="provider"> 
     {{ provider.provider }} 
    </td> 
    <td class="email"> 
     {% for profile in provider.userprofile_set.all %} 
      {{ profile.user }} 
     {% endfor %}  
    </td> 
</tr> 
{% endfor %} 

이 생산 여기에 지금까지 무엇을 가지고 약 250 개의 쿼리가 템플릿의 Provider QuerySet을 반복하고 있습니다. 위의 개선 방법은 무엇입니까? 여기에 prefetch_related 또는 select_related을 사용하는 방법이 있습니까?

답변

1

사용 prefetch_related()을; select _related()ManyToManyField의에서 작동하지 않습니다

providers = Provider.objects.order_by('provider').all().prefetch_related('userprofile_set') 

를 문서에서 :

지정된 조회의 각 객체 관련, 하나의 일괄 자동으로 검색하는 QuerySet를 돌려줍니다.

select_related과 비슷한 목적을 가지고 있습니다. 두 가지 모두 관련 객체에 액세스하여 발생하는 데이터베이스 쿼리의 대홍수를 막을 수 있도록 설계되었지만 전략은 매우 다릅니다.

prefetch_related

는 ... 한편, 각각의 관계에 대한 별도의 검색을 수행하고, 파이썬에 '접합'하지. 이를 통해 select_related이 지원하는 외래 키 및 일대일 관계 외에도 select_related을 사용하여 수행 할 수없는 다 대다 및 다 대일 개체를 미리 가져올 수 있습니다.

0

내가 장고를 사용하지 않는하지만 난 그냥 여기 해답을 발견 : docs.djangoproject.com

providers = Provider.objects.select_related().order_by('provider').all() 
+0

네, 처음 시도한 방법입니다. 아무런 개선이 없었습니다. – David542

+0

아, "all()"을 추가하려고 했습니까? – Besnik

+0

이 경우 모두 중복됩니다. (테스트는 똑같습니다.) – David542

관련 문제