TIL28 | Many-to-Many관계, Django의 ManyToManyField

2021. 10. 20. 15:44언어/Python

반응형

Many-to-Many 관계

  • M : N 의 관계 (고객과 제품, 학생과 강의, 팔로우와 팔로워)
  • Django에서는 ManyToManyField를 지원한다.

 

ManyToManyField

ManyToManyField(RelatedField)

  • ManyToManyField를 사용할 경우 자동으로 중간 테이블을 설정해준다.
  • 정참조와 역참조 객체 호출
    • 정참조의 경우 : 속성으로 접근
    • 역참조의 경우 : _set 또는 related_name 으로 접근

 

from django.db import models

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField('Publication', related_name='publications')

    class Meta:
        ordering = ['headline']

    def __str__(self):
        return self.headline


class Publication(models.Model):
    title = models.CharField(max_length=30)

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

'''
ManyToManyField를 사용하지 않고 중간테이블을 생성하여 FK로 연결해주는 경우

class ArticlePublication(models.Model):
    article = models.ForeignKey('Article',on_delete=models.CASCADE)
    publication = models.ForeignKey('Publication',on_delete=models.CASCADE)
'''    

 

데이터 생성 - Create

# publication 데이터 생성
p1 = Publication(title='The Python Journal')
p1.save()

p2 = Publication(title='The Java Journal')
p2.save()

# article 데이터 생성 후 add()를 통해서 중간테이블에 데이터 저장
a1 = Article(headline='Django lets you build Web apps easily')
a1.save()

a1.publications.add(p1, p2)

중간테이블을 따로 생성해서 FK로 연결한 경우

# publication & article 데이터 생성
p1 = Publication.objects.create(title='The Python Journal')
p2 = Publication.objects.create(title='The Java Journal')
a1 = Article.objects.create(headline='Django lets you build Web apps easily')

# 중간 테이블 (ArticlePublication)에 저장
ArticlePublication.objects.create(publication=p1, article=a1)
ArticlePublication.objects.create(publication=p2, article=a1)

 

데이터 읽기 - Get

a1 = Article.objects.get(pk=1)

a1.publications.get()
a1.publications.get().title

중간테이블을 따로 생성해서 FK로 연결한 경우

a1 = Article.objects.get(pk=1)

a1.articlepublication__set.all()
a1.articlepublication__set.get()
a1.articlepublication__set.get().publication.title

 

ManyToManyField를 사용했을 때의 이점

ManyToManyField를 사용하면 중간 테이블을 거치지 않고, 언제든지 데이터를 쉽게 추가하고 가져올 수 있다.

접근성이 쉬운 것 같다.

보통 through 옵션을 사용해서 중간 테이블을 직접 설정한다.

 

참고 사이트

django ref. Many-to-many relationships

[TIL. 36]Many To Many relationship의 장점

[Django] ManyToMany - related_name

반응형