나는 여러 외부 키 필드가있는 모델을 가지고 있습니다. 모델 '유형', '레벨', '색상', '강도'(일반적인 예) 필드가있는 모델 제품입니다.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 가지 형식에만 나타나기를 원하지는 않을 것입니다.
데이터베이스가 불필요하게 망치질 않도록 내 모델/양식 /보기/템플릿을 최적화 할 수있는 방법이 있습니까?
-
면책 조항 : 나는 장고와 파이썬 비교적 새로 온 사람이 어떻게 든 내장 해결할 수있는 방법이있을 생각을 떨칠 수 없습니다.
Nice Denis, 의미가 있습니다. 모두 같은 쿼리 세트 개체를 사용하게하십시오. 당신에게 대답 할 때 11 개월이 걸렸고, 8 개월이 걸렸습니다. 말하자면 'type', 'level', 'color'유형을 완전히 캐싱하여 이러한 문제를 해결했습니다. 이러한 변경 사항은 거의 변하지 않을 것입니다. 하지만 고마워, 다음 번에 내가 생각할 수있는 간단한 접근 방식이다. – davur
이것은 작동하지 않습니다. 양식은 기본 쿼리 세트로 구성되기 전에 이러한 쿼리를 바꿀 수 있으므로 많은 쿼리를 수행 할 수 있습니다. –
@ Adrián, 실제로 "예, 아니오"라고 생각합니다. 맞습니다. 기본 쿼리 세트는 Form 생성자에서 생성 될 것입니다. 그러나 쿼리 세트를 만드는 것은 데이터베이스를 쿼리하는 것과 동일하지 않습니다. 첫 x 째 u 리가 _ 행되기 전에 queryset을 Y \ 경우 여전히 불필요한 호출을 모두 데이터베이스에 저장할 수 있습니다. 템플리트에 첫 번째 양식을 표시하기 전에 그리고 각 양식에서'save'를 호출하기 전에이를 대체해야합니다. – davur