[Django] ChoicField/ModelChoicField의 디스플레이 속도 비교

5859 단어 djangoPythontech

개시하다


Django가 웹 애플리케이션을 개발하는 과정에서Form에서 사용자가 데이터를 선택하도록 하려는 상황에서 저는 ChoicField를 사용해야 하는지 모델ChoiceField를 사용해야 하는지 궁금합니다.
공식 문서 에서 ModelChoice Field 정보
Note that the default widget for ModelChoiceField becomes impractical when the number of entries increases. You should avoid using it for more than 100 items.
이런 견해가 있다.
ChoicField에는 이런 주의사항이 없습니다. 언뜻 보기에는 ModelChoiceField에 대량의 데이터가 있으면 성능이 현저히 떨어집니다.
실제 상황은 어떻습니까? ChoicField와ModelChoiceField를 사용하는 각자의 창 브라우저의 응답 속도를 검증했습니다.

환경 확인

  • Debian GNU/Linux 11 (bullseye) (Docker)
  • Python 3.9.7
  • Django 3.2.7
  • Google Chrome 93.0.4577.63
  • DB:SQLite3
  • 검증 방법


    귀찮은 분들은 날아가세요결실.
    Chrome DeveloperTools의 네트워크 탭은 Choic/Model Choice 둘 다 10000개의 데이터 형식을 설정한 페이지의 읽기 속도를 측정합니다.
    데이터는 각각 다음과 같이 설정한다.import문 등을 생략했습니다.

    ChoiceField


    forms.py
    choice_tuple = (
        ("1", "選択肢1"),
        ("2", "選択肢2"),
        # 中略
        ("9999", "選択肢9999"),
        ("10000", "選択肢10000"),
    )
    
    class SampleChoiceForm(forms.Form):
        choice = forms.ChoiceField(choices=choice_tuple)
    

    ModelChoiceField


    models.py
    class SampleModel(models.Model):
        choice = models.CharField(verbose_name="choice", max_length=255)
        
        def __str__(self) -> str:
            return self.choice
    
    forms.py
    class SampleChoiceForm(forms.Form):
        choice = forms.ModelChoiceField(queryset=SampleModel.objects)
    
    SampleModel 테이블의choice에는 '선택 항목 1' ~ '선택 항목 10000' 문자열이 포함되어 있습니다.

    공통부분


    뷰는 템플릿과 양식만 지정하는 매우 간단한FormView
    템플릿은 한 마디{{ form }}밖에 없어요. 정말 폼만 표시하는 템플릿이에요.

    결실


    거의 변하지 않았다.
    다음은 요청을 보낸 후의 각 응답 속도[초]입니다.
    크롬 Developer Tools의 네트워크 탭에서 각 필드를 5차례 측정했다.
    액세스할 때마다 캐시를 제거합니다.
    ChoiceField
    ModelChoiceField
    3.95
    4.15
    3.55
    3.78
    3.57
    3.81
    3.55
    3.76
    3.61
    3.80

    총결산


    의외로 이들의 집행 속도는 거의 변화가 없었다.평균적으로 ChoiceField는 0.2초 빠르지만 대체로 오차가 있는 범위죠.Django의 원본 코드를 쫓는 것이 아니기 때문에 내부 행동이 어떤지 모르겠지만 요구에 따라→Django 처리 요청→HTML 생성으로 응답하는 절차일 것 같습니다ModelChoiceField에서 지정한 SampleModel 쿼리를 발행하는 데 걸리는 시간은 약 0.2초입니다.의외로 빠르네요.그러나 이번에는 DB에 Django의 기본 SQLite3를 사용했지만, 다른 DB를 사용한 경우에는 차이가 날 가능성이 있다.
    그럼에도 불구하고 실제로 한 번의 질문에 대한 대답은 3초 이상 걸리면 할 수 없고 실제 운용에 있어서도 많은 요구를 받을 수 있다.가능하면 가볍게 처리하는 것이 좋다. 공식 문서에 따르면 ModelChoiceForm은 100개 이상의 조회에서 집중적으로 사용하지 않는 것이 좋다.
    만약 선택 항목이 변하지 않는다면 초이스 필드는 변경될 가능성이 있고 다른 표와 밀접한 관계가 있다면 모델 초이스 필드를 고려하고 데이터가 100개가 넘으면 (모델) 초이스 필드 이외의 방법을 고려하는 것이 적절하다고 생각합니다.

    좋은 웹페이지 즐겨찾기