터칭 데이터
장고(Django) 정참조와 역참조 본문
장고 개발을 공부하다보면 정참조와 역참조라는 단어를 들으실 수 있을겁니다.
정참조와 역참조에 대해 나누어 설명을 드리겠습니다.
정참조(Forward Reference)란?
Django에서 '정참조(Forward Reference)'는 모델 간의 관계에서 한 모델이 다른 모델을 참조하는 방향을 나타냅니다. 일반적으로 ForeignKey, OneToOneField, ManyToManyField와 같은 관계 필드를 사용하여 정참조를 설정합니다. 이러한 관계 필드를 사용하면 모델 간의 관계를 정의하고 하나의 모델에서 다른 모델로의 참조를 만들 수 있습니다.
예를 들어, 다음은 `Author` 모델과 `Book` 모델 간의 정참조를 나타내는 Django 모델 예제입니다:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
위의 코드에서 `Book` 모델은 `Author` 모델을 ForeignKey로 참조하고 있습니다. 이것은 `Book` 모델이 어떤 작가(`Author`)와 연결되어 있음을 나타냅니다. 이것이 정참조입니다. 즉, `Book` 모델이 `Author` 모델을 참조하고 있으므로 `Book` 모델은 `Author` 모델로의 정방향 참조를 가지고 있습니다.
정참조를 통해 모델 간의 관계를 설정하면 데이터베이스에서 테이블 간의 관계가 형성되며, Django는 이러한 관계를 사용하여 데이터를 쿼리하고 관리합니다. 이것은 Django의 ORM(객체 관계 매핑)의 핵심 개념 중 하나이며, 데이터베이스와 모델 간의 매핑을 효과적으로 처리하는 데 사용됩니다.
역참조(Reverse Lookup 혹은 Reverse Relationship)란?
Django 프레임워크에서 '역참조'는 모델 간의 관계에서 역방향으로 객체를 참조하는 것을 의미합니다. Django에서는 ForeignKey, OneToOneField, ManyToManyField와 같은 필드를 사용하여 모델 간의 관계를 정의할 수 있습니다. 이러한 관계 필드를 사용하면 하나의 모델에서 다른 모델로의 참조(정방향 참조)를 만들 수 있습니다.
그러나 '역참조'는 관계된 모델에서 역방향으로 연결된 모델의 역참조 이름을 사용하여 해당 모델로 다시 참조할 수 있도록 도와줍니다. 예를 들어, 다음과 같은 모델이 있다고 가정해봅시다:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
여기서 `Book` 모델은 `Author` 모델과 ForeignKey로 연결되어 있습니다. 이것은 책이 특정 작가와 연결되어 있음을 나타냅니다. 정방향으로 연결된 경우, `book.author`를 통해 책의 작가를 알 수 있습니다.
그런데 역참조를 사용하면, 'Author' 모델에서 'Book' 모델로 역방향으로 연결할 수 있습니다. 이를 통해 특정 작가가 작성한 모든 책을 가져올 수 있습니다. 역참조 이름은 기본적으로 소문자로 모델 이름과 "_set"을 붙여 생성됩니다. 따라서 위의 예에서 'Author' 모델에서 'Book' 모델로 역참조하려면 `author.book_set.all()`과 같은 방식으로 사용할 수 있습니다.
Django에서 역참조를 사용하면 관계된 모델 간의 연결을 효과적으로 탐색하고 관련된 객체를 검색할 수 있습니다.
'장고 (Django)' 카테고리의 다른 글
장고(Django) User 관리하기 (0) | 2023.11.05 |
---|---|
장고(Django) User 추가하기 (0) | 2023.11.05 |
장고(Django) Generic API View (0) | 2023.11.04 |
장고(Django) 믹스인(Mixin) (0) | 2023.11.04 |
장고(Django) 클래스(Class) 기반의 뷰(Views) (0) | 2023.11.04 |