Today I Learned/django

장고 django ManyToMany (N:M 다대다 관계)

하나719 2023. 9. 26. 01:15
반응형

N:M 관계 예시

인스타그램 같은 서비스를 생각해보면, #맛집 이라는 태그는 여러개의 포스트에도 달릴 수 있고, 

하나의 포스트에는 #맛집, #아이스크림 이렇게 여러개의 태그가 달릴 수 있습니다.

이럴 때 ManyToMany로 정의해줄 수 있습니다. 

 

정의 방법

N쪽에 정의를 해줘야하는 ForeignKey와 달리 어느쪽에 정의해주어도 상관없습니다. (대신 한쪽에 해줬으면 한쪽에는 X)

하지만 활용하는 쪽에 정의해주면 좀더 자연스럽습니다.

태그와 포스팅 관계에서는 태그를 활용하는 포스트에 정의를 해주는 것이 좋습니다.

 

class Post(models.Model)
	...
    Tag = models.ManyToMany('Tag', blank=True)
    
class Tag(models.Model)
	name = models.CharField(max_length=10)

 

여기서 참고하는 테이블 명을 ''으로 감싸서 텍스트로 작성해주었는데, Tag 클래스가 Post 클래스보다 아래에 구현되어 있기때문입니다.

blank=True 조건은 ManyToMany 관계를 정의할때 유용한데, 포스트는 태그를 여러개 가질수도 있지만, 갖지 않을수도 있기때문입니다.

 

 

Queryset _ 조회

양쪽 테이블 모두 모델명_set 으로 조회할 수 있습니다.

1) 

tag = Tag.objects.first()

tag.post_set.all()

 

2)

post = Post.objects.first()

post.tag_set.all()

 

Queryset_ 삽입: add

1. 한개 추가하기

tag = Tag.objects.get(name='장고')

post = Post.objects.first()

post.tag_set.add(tag)

 

2. 여러개 추가하기

tag = Tag.objects.all()

post = Post.objects.first()

post.tag_set.add(*tag) #unpack

 

Queryset_ 삭제: remove

tag = Tag.objects.get(name='장고')

post = Post.objects.first()

post.tag_set.remove(tag)

 

 

반응형