Django에서 외래 키의 역방향 조회

Vaibhav Vaibhav 2021년8월10일
Django에서 외래 키의 역방향 조회

Django는 웹 애플리케이션 생성을 단순화하는 효율적인 웹 개발 프레임 워크입니다. Django를 사용하면 인증 및 권한 부여, HTML 템플릿 생성, 정적 파일 처리, 데이터베이스와 상호 작용 및 CRUD 작업 수행을 쉽게 처리 할 수 ​​있습니다.

데이터베이스에 대해 말하자면, Django는 데이터베이스로 작업하는 동안 만들 수있는 대부분의 쿼리를 단순화합니다. 그러한 쿼리 중 하나는 반전보기입니다. 예는 동일한 테이블 또는 다른 모델의 특정 레코드를 참조하는 테이블의 모든 개체를 가져와야하는 경우입니다.

이 기사는 Django에서 외래 키의 역방향 조회를 수행하는 것이 얼마나 간단한 지 보여줍니다.

Django 모델의 역방향 조회

실제 단계로 이동하기 전에 데모 용 모델이나 테이블이 필요합니다. 우리는 교사와 학생의 두 가지 실체를 고려할 것입니다. 학생에게는 두 가지 유형의 교사가 있습니다. 반 선생님과 좋아하는 선생님. Student모델은Teacher모델을 참조합니다.

from django.db import models


class Teacher(models.Model):
    name = models.CharField(max_length=200)
    subject = models.CharField(max_length=200)


class Student(models.Model):
    name = models.CharField(max_length=200)
    classTeacher = models.ForeignKey(
        Teacher, on_delete=models.SET_NULL, null=True, related_name="classTeacherOf"
    )
    favouriteTeacher = models.ForeignKey(
        Teacher, on_delete=models.SET_NULL, null=True, related_name="favouriteTeacherOf"
    )

Student모델의 두 필드는Teacher모델을 참조합니다. Django에서 동일한 모델을 두 번 이상 참조 할 때 단일 참조 필드에 대한 Django의 기본related_name이 다른 참조 필드와 충돌하기 때문에 모든 필드에 대해related_name을 제공해야합니다. 그렇지 않으면 Django는 예외를 발생시킵니다.

related_name은 역방향 조회에 사용하는 것입니다. 일반적으로 Django의 기본 관련 이름을 사용하는 대신 모든 외래 키에 대해related_name을 제공하는 것이 좋습니다.

예 1

id1인 교사가 있습니다. 이 개인을 담임 교사로 둔 모든 학생을 모아야한다면 다음을 수행합니다.

teacher = Teacher.objects.get(id=1)
students = teacher.classTeacherOf.all()
print(students)  # A QuerySet of Student objects

related_name을 사용하는 방법에 주목하십시오. teacher.classTeacherOf는 관리자 객체로all(),filter(),exclude()와 같은 메소드를 호출합니다.

예 2

id6인 선생님이 있습니다. 이 선생님을 가장 좋아하는 선생님으로 생각하는 모든 학생들을 모아야한다면 다음과 같이 할 것입니다.

teacher = Teacher.objects.get(id=6)
students = teacher.favouriteTeacherOf.all()
print(students)  # A QuerySet of Student objects

예제 3

id25인 교사가 있습니다. 이 선생님이id5인 학생의 담임 선생님인지 확인해야한다면 다음과 같이 할 것입니다.

teacher = Teacher.objects.get(id=25)
student = teacher.classTeacherOf.filter(id=5)
print(student)  # A QuerySet of either 1 or 0 Student

역방향 조회에서 오브젝트가 발견되지 않으면 빈QuerySet가 리턴됩니다.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

관련 문장 - Django Object