Django의 Select_related 메서드

Salman Mehmood 2023년6월20일
Django의 Select_related 메서드

이 기사는 쿼리 세트, 이러한 쿼리를 작동하는 방법 및 Django에서 select_related() 메서드를 사용하는 방법을 다룹니다. Django 프레임워크를 사용하면서 주로 query set을 사용합니다.

데이터베이스가 있고 쿼리를 수행한다고 가정합니다. supplier라는 모델이 있다고 가정하고 이 supplier를 통해 모든 공급자를 파악하여 공급자 목록을 갖게 되며 이 목록을 query set이라고 합니다. .

로직을 작성하고 두 개의 모델을 생성할 views.py 파일을 살펴보겠습니다. select_related() 메서드의 사용 사례를 설명하는 코드를 작성하기 시작합니다.

먼저 objects.all()을 사용하여 직원을 가져왔습니다. 해당 직원의 목록을 반복하고 emplyee.name을 사용하여 직원 이름을 인쇄해야 합니다.

암호:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all()
    for emplyee in employees:
        print(emplyee.name)

출력:

Jane Doe
John Doe
Simpson
John Simpson

디버그 도구를 사용하고 브라우저로 이동하면 모든 직원과 해당 부서 및 세부 정보를 가져오는 것을 볼 수 있습니다. objects.all() 이후 모든 직원을 선택하고 모든 세부 정보를 가져옵니다.

문제는 관련 모델에 접근할 때 시작됩니다. 예를 들어 models.py 파일을 살펴보고 관련된 모델인 employee 모델은 department 자체입니다.

다음 코드를 사용하여 직원 이름과 부서 이름을 인쇄합니다.

암호:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all()
    for emplyee in employees:
        print(emplyee.name, emplyee.department.name)

위의 코드에서 emplyee.department를 사용하며 부서는 외래 키입니다. 부서 이름이 있는 부서 개체를 제공합니다.

출력:

Jane Doe HR
John Doe Accounts
Simpson Purchase
John Simpson Purchase

Django 디버그 도구의 도움으로 Django 애플리케이션을 실행하는 동안 브라우저로 이동하면 여러 쿼리를 볼 수 있습니다. 첫 번째 쿼리에서 모든 직원을 선택하고 두 번째 쿼리에서 id가 1인 부서를 선택하는 것을 볼 수 있습니다.

employee의 기본 ID가 동일하더라도 동일한 ID가 있는 경우 ORM은 해당 테이블로 두 번 이동하여 중복 항목을 가져옵니다. 회사에 100명의 직원이 있다고 가정하면 101 쿼리를 실행하므로 department에서 100 쿼리를 실행하고 employee에서 쿼리 하나를 실행합니다.

이것은 ORM의 고전적인 무한 일 문제라고도 합니다. select_related() 메서드를 사용하여 해당 직원과 해당 부서를 가져오고 메서드에서 모델의 필드를 전달해야 합니다.

따라서 필드는 관련이 있는 것이 타당하며 이 경우에는 필드를 부서로 사용합니다.

암호:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all().select_related("department")
    for emplyee in employees:
        print(emplyee.name, emplyee.department.name)
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn