๐ชฃ Many to Many ๊ด๊ณ ํ ์ด๋ธ
์ฅ๊ณ Many to Many ๊ด๊ณํ ์ด๋ธ์ ๋ํด์ ์์๋ณด์.
๐ Many To Many
-
์ฅ๊ณ ์์๋ Mant To many ์ต์
์ ์ง์ ํ ์ ์๋๋ฐ ๋จ์ํ ๊ด๊ณ ํ
์ด๋ธ์ ๋๋ ๊ฒ๊ณผ Many To Many์ต์
์ ์ง์ ํ์ ๋ ์ฐจ์ด์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
-
์์ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
์ํ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ์ํ ํ
์ด๋ธ๊ณผ ๋ฐฐ์ฐ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ฐฐ์ฐํ
์ด๋ธ ๊ทธ๋ฆฌ๊ณ ์ด ๋์ ์ด์ด์ฃผ๋์ค๊ณํ
์ด๋ธ ์
๋๋ค.
๐ค ์ค๊ณ ํ
์ด๋ธ ์์ฑ
- Many to Many ํ๋๋ฅผ ์ง์ ํ์ง ์๊ณ ์ค๊ณ ํ
์ด๋ธ๋ง ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
class Actor(models.Model):
name = models.CharField(max_length=45)
class Movie(models.Model):
title = models.CharField(max_length=256)
class ActorMovie(models.Model):
actor = models.ForeignKey(Actor, on_delete=models.CASCADE)
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
์ฅ๊ณ ์์๋ Mant To many ์ต์ ์ ์ง์ ํ ์ ์๋๋ฐ ๋จ์ํ ๊ด๊ณ ํ ์ด๋ธ์ ๋๋ ๊ฒ๊ณผ Many To Many์ต์ ์ ์ง์ ํ์ ๋ ์ฐจ์ด์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
์์ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
์ํ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ์ํ ํ
์ด๋ธ๊ณผ ๋ฐฐ์ฐ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ฐฐ์ฐํ
์ด๋ธ ๊ทธ๋ฆฌ๊ณ ์ด ๋์ ์ด์ด์ฃผ๋์ค๊ณํ
์ด๋ธ ์
๋๋ค.
class Actor(models.Model):
name = models.CharField(max_length=45)
class Movie(models.Model):
title = models.CharField(max_length=256)
class ActorMovie(models.Model):
actor = models.ForeignKey(Actor, on_delete=models.CASCADE)
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
๊ฐ๋ ์ฑ์ ์ํด์ ์ปฌ๋ผ์ ์๋ ์ต๋ํ ์ค์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ณด๊ฒ ์ต๋๋ค.
- ์ํ ์์ฑ
m1 = Movie.objects.create(title="ํ
๋ท")
m2 = Movie.objects.create(title="๋ธ๋ ์ด๋๋ฌ๋2049")
- ๋ฐฐ์ฐ ์์ฑ
a1 = Actor.objects.create(name="์กด ๋ฐ์ด๋น๋ ์์ฑํด")
a2 = Actor.objects.create(name="๋ผ์ด์ธ ๊ณ ์ฌ๋ง")
- ๊ด๊ณ ํ ์ด๋ธ ๋ฐ์ดํฐ ๋ฃ๊ธฐ
ActorMovie.objects.create(actor=a1, movie=m1)
ActorMovie.objects.create(actor=a2, movie=m2)
- 1๋ฒ ๋ฐฐ์ฐ ์กด ๋ฐ์ด๋น๋ ์์ฑํด์ ์ถ์ฐ ์ํ๋ฅผ ์กฐํํด ๋ณด๊ฒ ์ต๋๋ค.
a1.actormovie_set.all()
for actormovie in a1.actormovie_set.all():
print(actormovie.movie.title)
์ํ, ๋ฐฐ์ฐ ๊ด๊ณ ํ
์ด๋ธ์ ์ญ์ฐธ์กฐํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์์๋ฅผ ํ๋ ๋นผ์ .movie.title
๋ก ์ ๊ทผํด์ผ ํฉ๋๋ค. ์ข ๋ฒ๊ฑฐ๋กญ๋ค๋ ๋๋์ด ๋ญ๋๋ค.
๐ชฃ Many to Many ์ค์
- ์ด๋ฒ์๋ ์ํ ํ ์ด๋ธ์ actor์นผ๋ผ์ ๋ฃ๊ณ many to many๋ฅผ ์ง์ ํ๊ฒ ์ต๋๋ค.
class Actor(models.Model):
name = models.CharField(max_length=45)
class Movie(models.Model):
title = models.CharField(max_length=256)
actor = models.ManyToManyField(Actor,
through='ActorMovie',
related_name='movies')
class ActorMovie(models.Model):
actor = models.ForeignKey(Actor, on_delete=models.CASCADE)
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
- through ์ต์ ์ ๊ด๊ณํ ์ด๋ธ์ ์ง์ ํ๋ ์ต์
- related_name์ ์ญ์ฐธ์กฐ๋ฅผ ํ๊ธฐ์ํ ์ด๋ฆ ์ค์
์ด์ ์ํ ๋ค์ ์กด ๋ฐ์ด๋น๋ ์์ฑํด๋ฐฐ์ฐ์ ์ํ๋ฅผ ์กฐํํด๋ณด๊ฒ ์ต๋๋ค.
a1.movies.all()
for movie in a1.movies.all():
print(movie.title)
>>> "ํ
๋ท"
๊ด๊ณ ํ
์ด๋ธ์ ์์ฑํ ๊ฒฝ์ฐ๋ณด๋ค ๋ฉ์๋ ํ๊ฐ๋ฅผ ๋ ์ธ ์ ์์ต๋๋ค. .movie.title
-> .title
์ข ๋ ์ง๊ด์ ์ด๊ฒ ๊ด๊ณํ ํ ์ด๋ธ์ ์กฐํํ ์ ์์ต๋๋ค.
๐งช ์ค๊ณ ํ ์ด๋ธ ์์ ๊ธฐ
- ์ค๊ณ ํ ์ด๋ธ์ ์์ ๊ณ Many to Many์ต์ ์ ์ง์ ํด๋ ๋ฉ๋๋ค.
class Actor(models.Model):
name = models.CharField(max_length=45)
class Movie(models.Model):
title = models.CharField(max_length=256)
actor = models.ManyToManyField(Actor,
related_name='movies')
์ด๋ ๊ฒ ํ๋ฉด ์๊น์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
a1 = Actor.objects.create(name="์กด ๋ฐ์ด๋น๋ ์์ฑํด")
a1.movies.all()
for movie in a1.movies.all():
print(movie.title)
>>> "ํ
๋ท"
๐ค ์ค๊ณ ํ ์ด๋ธ์ ์๋๊น?
- ๊ทธ๋ ๋ค๋ฉด ์๋ฌธ์ด ํ๋ ์๊น๋๋ค. ๋ญํ๋ฌ ์ค๊ณํ ์ด๋ธ์ ๋๋๊ฐ?
์ค๊ณ ํ ์ด๋ธ์ ๊ด๊ณํ๋ ํ ์ด๋ธ foreignkey์ธ์ ๋ค๋ฅธํญ๋ชฉ์ ์ถ๊ฐํ๊ณ ์ ํ ๋ ํ์ํฉ๋๋ค.
์ค๊ณํ ์ด๋ธ์ ์ ๋ง๋ค๊ณ Many to Many์ต์ ์ ์ง์ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋์ผ๋ก ๊ด๊ณํ ์ด๋ธ์ด ์์ฑ๋๋๋ฐ ์ด ํ ์ด๋ธ์ ์ปฌ๋ผ์ ์ถ๊ฐํ๊ณ ์ ํ๋ฉด ์ง์ ์ฅ๊ณ ์์ ๋ง๋ค์ด์ผ ์ถ๊ฐํ๊ณ ์ ํ๋ ์ปฌ๋ผ์ด ๋ฐ์๋ฉ๋๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ชฃ Many to Many ๊ด๊ณ ํ ์ด๋ธ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@sdk1926/Many-to-Many-๊ด๊ณ-ํ ์ด๋ธ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค