[Django] 참조, 역참조

그냥·2022년 6월 28일
0

django

목록 보기
15/20

장고에서 Modeling을 할 때 한 테이블이 어떤 테이블과 ForeignKey로 연결되어 있을 때 manager를 통해서 참조 또는 역참조를 할 수 있다. 이번 포스팅은 장고에서의 참조, 역참조를 하는 방법에 대해서 알아보려고 한다.



model

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()
    
    def Meta:
    	db_tables = blogs

class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    
    def Meta:
    	db_tables = authors

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()
    
    def Meta:
    	db_tables = entries

참조(Forward)

  • 참조란 ForeignKey를 가지고 있는 model instance가 참조하는 model instance를 접근하는 것을 뜻한다.
entry 	   = Entry.objects.get(id=1)
entry_blog = entry.blog # Blog 객체를 반환한다.

역참조(backward)

  • 역참조란 위와 반대로 자신을 ForeignKey로 가지고 있는 model instance에 접근하는 것을 뜻한다.
  • 이때 model instance에 접근하기 위해서는 Manager를 이용해야 한다. Manger이름은 Field 선언시 option으로 realted_name = ""을 하지 않았다면 기본값은 아래와 같다.

Manager 명명법: entry_set (entry는 역참조 하는 Model Instance(Entry)의 소문자 이름이다)

Manger는 QuerySet을 반환한다.

blog = Blog.objects.get(id=1)
blog.entry_set.all() # 모든 Entry 객체를 반환한다.

# blog.entry_set QuerySet을 반환하는 Manager이다.
blog.entry_set.filter(headline__contains='')
blog.entry_set.count()

0개의 댓글

관련 채용 정보