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

10383 ワード

🤷 期間:2021.04.29~2021.04.30
🤷 資料:https://www.notion.so/wecode/Django-C-R-U-D-2-98d0ec4c3de844338e769096aee13537
🤷 内容:views.py作成

オーダー

  • 初期設定(project=owner&dogapp = owner)
  • actor/movie/models.py
  • actor/actor/urls.py
  • actor/movie/urls.py
  • 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


    実現する。

  • キャストリスト
  • 배우이름배우생년월일출연 영화含む
  • 映画リスト
  • 영화이름개봉날짜출연진名前含む
  • 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"
            },
            [
                {
                    "출연진": "신승호"
                }
            ]
        ]
    }