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
id
가1
인 교사가 있습니다. 이 개인을 담임 교사로 둔 모든 학생을 모아야한다면 다음을 수행합니다.
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
id
가6
인 선생님이 있습니다. 이 선생님을 가장 좋아하는 선생님으로 생각하는 모든 학생들을 모아야한다면 다음과 같이 할 것입니다.
teacher = Teacher.objects.get(id=6)
students = teacher.favouriteTeacherOf.all()
print(students) # A QuerySet of Student objects
예제 3
id
가25
인 교사가 있습니다. 이 선생님이id
가5
인 학생의 담임 선생님인지 확인해야한다면 다음과 같이 할 것입니다.
teacher = Teacher.objects.get(id=25)
student = teacher.classTeacherOf.filter(id=5)
print(student) # A QuerySet of either 1 or 0 Student
역방향 조회에서 오브젝트가 발견되지 않으면 빈QuerySet
가 리턴됩니다.