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
반응형
'언어 > Python' 카테고리의 다른 글
TIL30 | CodeKata 중복되지 않은 알파벳 중 제일 긴 단어, 뒤집은 모양이 같은 숫자 찾기, ⭐️공통된 시작 단어 찾기 (0) | 2021.10.22 |
---|---|
TIL29 | Django C.R.U.D : Wrap up 정리 (0) | 2021.10.20 |
TIL27 | Django C.R.U.D : URLconf, Model, View (0) | 2021.10.20 |
TIL26 | CodeKata 배열 요소 조합해서 특정 수 만들기, 숫자 뒤집기 (0) | 2021.10.19 |
TIL25 | httpie 사용하기 (0) | 2021.10.19 |