movies/models.py
from django.db import models
class Actor(models.Model):
first_name = models.CharField(max_length=45)
last_name = models.CharField(max_length=45)
date_of_birth = models.DateField()
movie = models.ManyToManyField("Movie", through="ActorMovie")
# ManyToManyField를 적용할 때, 객체의 이름을 가독성, 구별하기 쉽게하기 위하여 's'를 붙여 표시함
# 예를들면, movie ▻ movies 으로 설정하여 가독성 및 판별하기 쉽도록 정해준다.
# 굉장히 유용하고 꼭 적용해야함
"""
- 참고사항 -
# movie = models.ManyToManyField("Movie", through="ActorMovie", related_name="actors")
# related_name 설정해주는 방법(설정하면 views.py에서 "actor_set" 대신 "actors"를 사용 가능하다)
"""
class Meta:
db_table = "actors"
class Movie(models.Model):
title = models.CharField(max_length=45)
release_date = models.DateField()
running_time = models.IntegerField()
class Meta:
db_table = "movies"
class ActorMovie(models.Model):
actor = models.ForeignKey("Actor", on_delete=models.CASCADE)
movie = models.ForeignKey("Movie", on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = "actors_movies"
# 1. makemigrations : migration 파일 생성(설계도 생성)
$ python manage.py makemigrations
# 2. migrate : 생성한 migration파일을 database에 적용
$ python manage.py migrate
import json
from django.http import JsonResponse
from django.views import View
from movies.models import Actor, Movie
class ActorsView(View):
def get(self, request):
results = [
{
'first_name' : actor.first_name,
'last_name' : actor.last_name,
'movie_list' : [{
'title': movie.title
} for movie in actor.movie.all()]
} for actor in Actor.objects.all()
]
return JsonResponse({"results" : results}, status=200)
class MoviesView(View):
def get(self, request):
results = [
{
'title' : movie.title,
'running_time' : movie.running_time,
'actor_list' : [{
'actor': actor.first_name
} for actor in movie.actor_set.all()]
} for movie in Movie.objects.all()
]
return JsonResponse({"results" : results}, status=200)
class ActorView(View):
def get(self, request):
actors = Actor.objects.all()
results = []
for actor in actors:
actors_movies = ActorMovie.objects.filter(actor_id = actor.id)
movie_list = []
for actor_movie in actors_movies:
movie_list.append({
"id" : actor_movie.movie.id,
"title" : actor_movie.movie.title
})
result.append({
"first_name" : actor.first_name
"movies" : movie_list
})
return JsonResponse({"results" : results}, status=200)
class ActorView(View):
def get(self, request):
actors = Actor.objects.all()
results = []
for movie in movies:
movie_list.append({
"id" : movie.id,
"title" : movie.title
})
results.append({
"first_name" = actor.first_name,
"last_name" = actor.last_name,
"movies" : movie_list
})
return JsonResponse({"results" : results}, status=200)