2016-06-12 5 views
4

모델 :장고 만들기 1000 개 중복 쿼리

class Comment(MPTTModel): 

    submitter = models.ForeignKey(User, blank=True, null=True) 
    post = models.ForeignKey(Post, related_name="post_comments") 
    parent = TreeForeignKey('self', blank=True, null=True, related_name="children") 
    text = models.CharField("Text", max_length=1000) 
    rank = models.FloatField(default=0.0) 
    pub_date = models.DateTimeField(auto_now_add=True) 

노드를 통해 반복하는 것은 같은 효과 (> 1000 쿼리)가 있습니다.

+0

툴바를 사용하면 포함 된 추적 표시를 표시 할 수 있습니까? 난 당신이 SQL 또는 뭔가의 측면을 클릭 할 수있을 것 같아요. – TankorSmash

답변

3

관련 개체를 참조 할 때 반복되는 모든 개체가 데이터베이스에 도달하기 때문에 중복 쿼리가 발생합니다.

보기 방법으로 select_related을 사용해보세요.

아마도 장고 프리 페치 관련 또는 관련 선택을 사용하여 해결할 수 있지만 작동하지 않을 경우 미안하지만 원시 쿼리가 필요합니다.

장고 쿼리 최적화에 대해 읽은 적이 있습니까? 다음은 많은 것들을 설명하는 간단한 튜토리얼입니다. http://bookofstranger.com/optimizing-django-orm-queries-for-best-performance/

1

MPTT 모델과 비슷한 문제가 있습니다. select_related (부모의 외래 키에도 해당)으로 해결되었습니다. 그래서, 필요에 따라 적절한의 검색어 월은 다음과 같습니다

Comment.objects.select_related('post', 'submitter', 'parent', 'parent__submitter', 'parent__post') 

을 또한, 당신은뿐만 아니라 루프에 의견의 자녀를 필요로하는 경우, 그것은 그런 식으로 최적화 할 수 있습니다 :

queryset.prefetch_related('children') 

심지어 그런 :

:

queryset.prefetch_related(
    Prefetch(
     'childred', 
     queryset=Comment.objects.select_related('post'), 
     to_attr='children_with_posts' 
    ) 
) 

... 그리고 트리 깊이에 따라, 당신은을 사용할 수 있습니다

queryset.select_releated('parent', 'parent__parent', 'parent__parent__parent') 
# you got the idea:)