2012-03-06 2 views
7

나는 여러 외부 키 필드가있는 모델을 가지고 있습니다. 모델 '유형', '레벨', '색상', '강도'(일반적인 예) 필드가있는 모델 제품입니다.Django 인라인 formsets 및 choicefields 너무 많은 db 쿼리를 생성합니다.

제품 유형이 인라인 양식 세트 인 유형 양식과 extra=10을 사용하여 추가 제품 인라인을 추가하는 옵션을 사용하여 주어진 유형의 모든 제품을 편집 할 수있는 페이지가 있습니다.

내가 아주 이상한 것을 발견 할 때마다 매번 템플릿에서 외장 키 선택 필드 중 하나를 출력 할 때마다 장고는 옵션을 얻을 때마다 데이터베이스를 쿼리합니다. 예를 들어

: 20 개 제품 (10 빈 별도 양식) 위의 코드는 90 쿼리에 달하는 수준, 색상과 강도에서 30 select * from ...이 (장고 디버그 도구 모음을 사용하여 공개) 발행, 3

{% for form in formset %} 
    {{ form.level }} 
    {{ form.color }} 
    {{ form.intensity }} 
{% endfor %} 

충분해야합니다. 옵션은 중반 요청을 변경하지 않을 수도 있지만, 그렇다고하더라도 새로 추가 된 일부 옵션이 마지막 5 가지 형식에만 나타나기를 원하지는 않을 것입니다.

데이터베이스가 불필요하게 망치질 않도록 내 모델/양식 /보기/템플릿을 최적화 할 수있는 방법이 있습니까?

-

면책 조항 : 나는 장고와 파이썬 비교적 새로 온 사람이 어떻게 든 내장 해결할 수있는 방법이있을 생각을 떨칠 수 없습니다.

답변

4
field_queryset = Test.objects.all()  
for form in formset: 
     form.fields['test_field'].queryset = field_queryset 

이와같이.

+0

Nice Denis, 의미가 있습니다. 모두 같은 쿼리 세트 개체를 사용하게하십시오. 당신에게 대답 할 때 11 개월이 걸렸고, 8 개월이 걸렸습니다. 말하자면 'type', 'level', 'color'유형을 완전히 캐싱하여 이러한 문제를 해결했습니다. 이러한 변경 사항은 거의 변하지 않을 것입니다. 하지만 고마워, 다음 번에 내가 생각할 수있는 간단한 접근 방식이다. – davur

+0

이것은 작동하지 않습니다. 양식은 기본 쿼리 세트로 구성되기 전에 이러한 쿼리를 바꿀 수 있으므로 많은 쿼리를 수행 할 수 있습니다. –

+1

@ Adrián, 실제로 "예, 아니오"라고 생각합니다. 맞습니다. 기본 쿼리 세트는 Form 생성자에서 생성 될 것입니다. 그러나 쿼리 세트를 만드는 것은 데이터베이스를 쿼리하는 것과 동일하지 않습니다. 첫 x 째 u 리가 _ 행되기 전에 queryset을 Y \ 경우 여전히 불필요한 호출을 모두 데이터베이스에 저장할 수 있습니다. 템플리트에 첫 번째 양식을 표시하기 전에 그리고 각 양식에서'save'를 호출하기 전에이를 대체해야합니다. – davur

1

change the queryset used by the formset 일 수 있으며 각 for 루프 반복마다 쿼리를 실행하는 대신 select_related()을 사용하여 FK 조인을 생성 할 수 있습니다.

+1

이러한 상황에서 어떻게 도움이되는지 나는 알 수 없습니다. 쿼리 세트는 제품의 현재 값을 선택하기위한 것이고 select_related는 현재 각 제품에 링크 된 레벨/색상/강도 오브젝트를 가져 오는 데 도움이 될 수 있습니다. Select_related는 Select 상자를 채우기 위해 전체 선택 옵션 세트를 프리 페치하는 데 실제로 어떤 도움이됩니까? – davur

+0

그래, 아약스 자동 완성 (django-ajax-select)을 사용하거나 쿼리 캐시 (johnnycache)를 사용할 수도있다. – jpic

관련 문제