Django에서 related_name 의 용도
related_name 은 Django 모델에서 외래 키(foreign key) 관계를 정의할 때 사용되는 옵션 매개 변수입니다. 이는 두 모델 간의 관계를 정의하는 데 도움이 되며, 특히 역참조(reverse lookup) 를 수행할 때 유용합니다.
역참조(Reverse Lookup) 용이하게 하기:
related_name 을 사용하지 않으면 Django는 기본적으로 외래 키 관계의 이름에 '_set' 을 추가하여 역참조 이름을 자동으로 생성합니다.
예를 들어, Author
모델에 Book
모델의 외래 키가 있다면, Book
모델에서 Author
객체 목록에 액세스하려면 기본적으로 author_set
속성을 사용해야 합니다.
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
이 경우, Book
객체에서 author
객체 목록에 액세스하려면 다음과 같이 해야 합니다.
book = Book.objects.get(pk=1)
authors = book.author_set.all()
하지만, related_name 을 사용하면 역참조 이름을 자유롭게 정의할 수 있어 코드 가독성을 향상시킬 수 있습니다.
예를 들어, Book
모델에서 author
객체 목록에 액세스하기 위한 역참조 이름을 written_by
로 설정하려면 다음과 같이 합니다.
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='written_by')
book = Book.objects.get(pk=1)
authors = book.written_by.all()
다대다 관계(ManyToManyField) 에서 사용:
다대다 관계(ManyToManyField) 에서도 related_name 을 사용하여 역참조 이름을 정의할 수 있습니다.
예를 들어, Author
모델과 Book
모델 간에 다대다 관계가 있다고 가정해봅시다.
이 경우, Author
모델에서 자신이 쓴 모든 책 목록에 액세스하고 싶을 수 있습니다.
기본적으로 Django는 다대다 관계의 경우 '_through' 를 사용하여 역참조 이름을 생성합니다.
따라서 Author
모델에서 자신이 쓴 모든 책 목록에 액세스하려면 다음과 같이 해야 합니다.
author = Author.objects.get(pk=1)
books = author.books_through.all()
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
title = models.CharField(max_length=255)
class AuthorBook(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
book = models.ForeignKey(Book, on_delete=models.CASCADE)
Author.objects.update_or_create(
defaults={'name': 'Stephen King'},
name='Stephen King',
)
Book.objects.update_or_create(
defaults={'title': 'IT'},
title='IT',
)
author = Author.objects.get(name='Stephen King')
books = author.written_books.all()
print(books) # Output: [<Book: IT>]
Django에서 related_name 사용 예제 코드
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='written_books') # related_name 사용
author = Author.objects.get(pk=1)
books = author.written_books.all() # 역참조 이름 사용
print(books) # Output: [<Book: 제목1>, <Book: 제목2>, ...]
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
title = models.CharField(max_length=255)
class AuthorBook(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books') # related_name 사용
book = models.ForeignKey(Book, on_delete=models.CASCADE)
author = Author.objects.get(pk=1)
books = author.books.all() # 역참조 이름 사용
print(books) # Output: [<Book: 제목1>, <Book: 제목2>, ...]
from django.db.models import Q
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='written_books')
authors = Author.objects.filter(
Q(written_books__title__icontains='검색어') |
Q(written_books__author__name__icontains='검색어')
)
위 코드는 written_books
related_name을 사용하여 Author
모델을 필터링합니다.
이는 Book
모델의 제목 또는 저자 이름에 '검색어'가 포함된 모든 Author
객체를 검색합니다.
참고:
- 이 예제 코드는 Django 3.2 기준으로 작성되었습니다.
- 다른 Django 버전을 사용하는 경우, 일부 코드가 변경될 수 있습니다.
Django에서 related_name 대신 사용할 수 있는 방법
기본 역참조 이름 사용:
class Author(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
book = Book.objects.get(pk=1)
authors = book.author_set.all()
이 방법은 related_name 을 사용하는 것보다 코드가 더 간결하지만, 역참조 이름이 직관적이지 않을 수 있습니다. 특히, 여러 개의 외래 키 관계가 있는 모델에서 사용하면 코드 가독성이 저하될 수 있습니다.
Content Management System (CMS) 에서 제공하는 기능 사용:
Django 기반 CMS를 사용하는 경우, CMS에서 제공하는 역참조 기능을 사용할 수 있습니다. 대부분의 CMS는 외래 키 관계를 정의하고 역참조 이름을 설정하는 데 도움이 되는 관리 인터페이스를 제공합니다.
직접 쿼리 작성:
related_name 을 사용하지 않고 직접 쿼리를 작성하여 역참조를 수행할 수도 있습니다. 하지만, 이 방법은 더 복잡하고 오류 발생 가능성이 높습니다. 따라서, related_name 을 사용하거나 CMS에서 제공하는 기능을 사용하는 것이 일반적으로 권장됩니다.
python django foreign-keys