🥣 ManyToManyField + Foreign Key
models.py
Movie5와 Actor5의 중간테이블 작성
Movie5를 참조하는 클래스Actor5에 ManyToManyField 추가
movie = models.ManyToManyField(Movie5, through='ActorMovie5', related_name='haha')
through= Movie5와 Actor5의 중간테이블 클래스
related_name= 역참조할 때 클래스_set을 대체할 이름
class Movie5(models.Model):
title = models.CharField(max_length=20)
release_date = models.DateField()
running_time = models.IntegerField()
class Meta:
db_table = 'movies5'
class Actor5(models.Model):
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
date_of_birth = models.DateField()
movie = models.ManyToManyField(Movie5, through='ActorMovie5', related_name='haha')
class Meta:
db_table = 'actors5'
class ActorMovie5(models.Model):
actor = models.ForeignKey('Actor5', on_delete=models.CASCADE)
movie = models.ForeignKey('Movie5', on_delete=models.CASCADE)
class Meta:
db_table = 'actors_movies5'
views.py
- 중간테이블이 있지만
ManyToManyField를 주었기 때문에, 데이터를 불러올 때 중간테이블을 거치지 않아도 된다.
actors = Actor.objects.all()
results = []
for actor in actors:
movies = actor.actormovie_set.all()
results.append(
{
...
"movies": [movie.movie.title for movie in movies]
}
)
actors = Actor.objects.all()
results = []
for actor in actors:
movies = actor.movie.all()
results.append(
{
...
"movies": [movie.title for movie in movies]
}
)
class Actor5View(View):
def get(self, request):
actors = Actor5.objects.all()
results = []
for actor in actors:
movies = actor.movie.all()
results.append(
{
'first_name': actor.first_name,
'last_name': actor.last_name,
'date_of_birth': actor.date_of_birth,
'movies': [movie.title for movie in movies]
}
)
return JsonResponse({'results': results}, status=200)
class Movie5View(View):
def get(self, request):
movies = Movie5.objects.all()
results = []
for movie in movies:
actors = movie.haha.all()
results.append(
{
'title': movie.title,
'release_date': movie.release_date,
'running_time': movie.running_time,
'actors': [actor.first_name + ' ' + actor.last_name for actor in actors]
}
)
return JsonResponse({'results': results}, status=200)