C.R.U.D #2 Exercise(영화 & 영화배우) (models.py & views.py)

Jayson Hwang·2022년 5월 11일
0

Django Basics

목록 보기
6/14
post-thumbnail

1.. Models.py 작성

  • models.py 에 Model Class 작성을 통해서 Database의 테이블과 Mapping

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"
  • models.py 작성한 내용 DB에 적용
# 1. makemigrations : migration 파일 생성(설계도 생성)
$ python manage.py makemigrations

# 2. migrate : 생성한 migration파일을 database에 적용
$ python manage.py migrate

2.. Views.py 작성

2-1.. Case 1.. ManyToManyField 사용

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)

2-2.. Case 2.. ForeignKey 이용 (중간 table)

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)

2-3.. Case 3.. ForeignKey 이용 (Movie table)

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)
profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글