WIL #10 [Django]actor&movie(views.py)

🤷 기간 : 2021.04.29 ~ 2021.04.30
🤷 자료 : https://www.notion.so/wecode/Django-C-R-U-D-2-98d0ec4c3de844338e769096aee13537
🤷 내용: views.py 작성


순서

  1. 초기세팅(project=owner&dog / app = owner)
  2. actor/movie/models.py
  3. actor/actor/urls.py
  4. actor/movie/urls.py
  5. actor/movie/views./py

1. actor/movie/models.py

ManyToMany Field

위의 모델링을 보고 app의 models.py작성하자

from django.db import models

# Create your models here.
class Actor(models.Model):
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    date_of_birth = models.DateField(null=True)

    def __str__(self):
        return self.first_name
    
    class Meta:
        db_table = 'actors'

class Movie(models.Model):
    title = models.CharField(max_length=45)
    release_date = models.DateField(null=True)
    running_time = models.IntegerField()
    actor = models.ManyToManyField("Actor", through='ActorMovie')	# 일단 나는 Movie 클래스에서 Actor로 걸어놓았는데 뭐 이건 Actor클래스안에 Movie로 걸어도 상관 없고/ 근데 후자로 했을때 views.py는 좀 달라지겠지 

    def __str__(self):
        return self.title
    
    class Meta:
        db_table = 'movies'

class ActorMovie(models.Model):
    actor = models.ForeignKey("Actor",on_delete=models.CASCADE)		# ManyToManyField를 한다고 해도 models.py에서 중간테이블은 꼭 만들어 주세여 ^^
    movie = models.ForeignKey("Movie",on_delete=models.CASCADE)

    class Meta:
        db_table = 'actorsmovies'

2. actor/actor/urls.py

from django.urls import include, path		# 1. include 추가해주고

urlpatterns = [
    path('actors/', include('movie.urls'))	# 2. "actors" 경로, movie.urls와 연결한다
]

3. actor/movie/urls.py

from django.urls import path			# 1. 이건 전체 줄을 추가해야해 파일 새로 만들어야해서/ 근데 여긴 include 추가안해줘도돼

from movie.views import ActorView, MovieView	# 2. 또는, 이렇게 구체적인 클래스를 임포트 해주면돼

urlpatterns = [ # urlpatterns 추가해
    path('', ActorView.as_view()),		# 3-1 views에서 ActorView를 가져다가 쓸꺼/ 왜 path 안지정해 두냐 ? 원하면 해도되는데 처음에 먼저 "actor/"을 보여줄꺼야
    path('movie/', MovieView.as_view()),	# 3-2 views에서 MovieView를 가져다가 쓸꺼 / path는 actor/movie/임
]

4. owner/views./py

구현할 것.

  1. 배우 리스트
    • 배우이름, 배우생년월일, 출연 영화 포함
  2. 영화 리스트
    • 영화이름, 개봉날짜, 출연진 이름 포함
import json

from django.http     import JsonResponse    # 장고 http에서 JsonResponse를 가져와
from django.views    import View        # 장고 views에서 View 가져와
from movie.models import Actor, Movie     # movie app의 model에서 클래스인 Actor과 Movie 가져 와 ㅡ ㅡ
# Create your views here.

class ActorView(View):						
    def post(self, request):					# http POST 127.0.0.1:8000/actor/ first_name=승호 last_name=신 date_of_birth=1991-11-04
        data = json.loads(request.body)
        actor = Actor.objects.create(				# 엑터 하나씩 추가하자 모델에 리스트 보고 그 변수들 보고 넣음됨 쉘에 넣는것처럼
            first_name = data['first_name'],			
            last_name = data['last_name'],
            date_of_birth = data['date_of_birth']
        )

        return JsonResponse({'MASSAGE':'SUCCESS'}, status=201)    

    def get(self, request):					# http GET 127.0.0.1:8000/actor/
        actors = Actor.objects.all()
        results =[]
        for actor in actors:
            actor_info = {
                'name' : actor.last_name + " " + actor.first_name,
                'date_of_birth' : actor.date_of_birth
            }
            results.append(actor_info)				# 1. 먼저 엑터 인포 먼저 추가
            movies = actor.movie_set.all()			# 2. 이거 중요 !!! / 무비에서 엑터로 걸었음 foreign key를 / 긍까 _set을 써서 이제 역으로 추적해서 가져올 수 있따 ! ! !
            results2 =[]
            for movie in movies: 				# 3. 그걸 끌고와서 하나식 넣고 
                results2.append(movie.title)			# 4. 끌고와서 영화 title 끌고오자 그리고 나서 새로운 리스트(result2)에 추가하기
            results.append(results2)				# 5. 그리고 result2를 result에 넣어버리자
        return JsonResponse({'results':results}, status=200)


class MovieView(View):
    def post(self, request):					# http POST 127.0.0.1:8000/actor/movie/ title=내인생이드라마 release_date=1991-11-04 running_time=29385723
        data = json.loads(request.body)
        movie = Movie.objects.create(
            title = data['title'],
            release_date = data['release_date'],
            running_time = data['running_time']
        )

        return JsonResponse({'MASSAGE':'SUCCESS'}, status=201)    

    def get(self, request):					# http GET 127.0.0.1:8000/actor/movie/
        movies = Movie.objects.all()
        results = []
        for movie in movies:
            movie_info = {
                'movie_name' : movie.title,
                'release_date' : movie.release_date
            }
            results.append(movie_info)
            actors = movie.actor.all()				# 1. 무비에서 엑터로 정방향 걸었기 때문에 그냥 무비에서 엑터가서 다 가져오기 
            results2=[]
            for actor in actors:
                actor_info = {
                    '출연진' : actor.last_name + actor.first_name
                }
                results2.append(actor_info)			# 2. 그래서 엑터 새로운 리져트에 또 넣고 
            results.append(results2)				# 3. result2를 result 1에 넣자

        return JsonResponse({'results':results}, status=200)


class ActorMovieView(View):
    def post(self, request):
        data  = json.loads(request.body)
        actor = Actor.objects.get(first_name=data['first_name'])
        movie = Movie.objects.get(title=data['title'])
        actormovie = ActorMovie.objects.create(
            actor = actor,
            movie = movie
        )

        return JsonResponse({'MASSAGE':'SUCCESS'}, status=201)     

결과

1. 배우 리스트

  • 배우이름, 배우생년월일, 출연 영화 포함
base ❯ http GET 127.0.0.1:8000/actor/	이거 넣으면 돼
HTTP/1.1 200 OK
Content-Length: 580
Content-Type: application/json
Date: Sat, 01 May 2021 13:45:14 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.1
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
`
{
    "results": [
        {
            "date_of_birth": "1991-11-04",
            "name": "신 승호"
        },
        [
            "내인생이드라마"
        ],
        {
            "date_of_birth": "1982-05-16",
            "name": "주 지훈"
        },
        [
            "신과함께-죄와벌",
            "암수살인",
            "간신",
            "아수라"
        ],
        {
            "date_of_birth": "1973-04-22",
            "name": "정 우성"
        },
        [
            "아수라",
            "신의한수",
            "감시자들"
        ],
        {
            "date_of_birth": "1988-12-16",
            "name": "박 서준"
        },
        [
            "사자",
            "기생충",
            "청년경찰"
        ]
    ]
}

2. 영화 리스트

  • 영화이름, 개봉날짜, 출연진 이름 포함
base ❯ http GET 127.0.0.1:8000/actor/movie/	# 이거 넣으면 돼
HTTP/1.1 200 OK
Content-Length: 1280
Content-Type: application/json
Date: Sat, 01 May 2021 13:45:16 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.1
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
`
{
    "results": [
        {
            "movie_name": "사자",
            "release_date": "2019-07-31"
        },
        [
            {
                "출연진": "박서준"
            }
        ],
        {
            "movie_name": "기생충",
            "release_date": "2019-05-30"
        },
        [
            {
                "출연진": "박서준"
            }
        ],
        {
            "movie_name": "청년경찰",
            "release_date": "2017-08-09"
        },
        [
            {
                "출연진": "박서준"
            }
        ],
        {
            "movie_name": "암수살인",
            "release_date": "2018-10-03"
        },
        [
            {
                "출연진": "주지훈"
            }
        ],
        {
            "movie_name": "신과함께-죄와벌",
            "release_date": "2017-12-20"
        },
        [
            {
                "출연진": "주지훈"
            }
        ],
        {
            "movie_name": "간신",
            "release_date": "2015-05-21"
        },
        [
            {
                "출연진": "주지훈"
            }
        ],
        {
            "movie_name": "아수라",
            "release_date": "2016-09-28"
        },
        [
            {
                "출연진": "주지훈"
            },
            {
                "출연진": "정우성"
            }
        ],
        {
            "movie_name": "신의한수",
            "release_date": "2014-07-03"
        },
        [
            {
                "출연진": "정우성"
            }
        ],
        {
            "movie_name": "감시자들",
            "release_date": "2013-07-03"
        },
        [
            {
                "출연진": "정우성"
            }
        ],
        {
            "movie_name": "내인생이드라마",
            "release_date": "1991-11-04"
        },
        [
            {
                "출연진": "신승호"
            }
        ]
    ]
}

좋은 웹페이지 즐겨찾기