[Django] C.R.U.D (2) Assignment Review Actor & Movie

juriยท2021๋…„ 7์›” 21์ผ
0

Django

๋ชฉ๋ก ๋ณด๊ธฐ
7/11
post-thumbnail

๐Ÿ“˜ Django C.R.U.D (2) Assignment Review

๐Ÿ’ก ๊ณผ์ œ

  1. ์œ„ ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ์„ ํ† ๋Œ€๋กœ models.py ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
  2. ๋“ฑ๋ก๋œ ๋ฐฐ์šฐ ๋ชฉ๋ก์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” GET ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.
    • ๋ฐฐ์šฐ์˜ ์ด๋ฆ„, ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์ถœ์—ฐํ•œ ์˜ํ™” ์ œ๋ชฉ ๋ชฉ๋ก
  3. ๋“ฑ๋ก๋œ ์˜ํ™” ๋ชฉ๋ก์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” GET ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.
    • ์˜ํ™”์˜ ์ œ๋ชฉ, ์ƒ์˜์‹œ๊ฐ„, ์ถœ์—ฐํ•œ ๋ฐฐ์šฐ ๋ชฉ๋ก (์ด๋ฆ„๋งŒ)

(1) Models

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()
    
    class Meta :
        db_table = 'actors'

class Movie(models.Model) :
    title        = models.CharField(max_length=45)
    release_date = models.DateField()
    running_time = models.PositiveIntegerField()
    actors       = models.ManyToManyField('Actor', related_name = movies)
    
    class Meta :
        db_table = 'movies'

(2) Views

import json

from django.http  import JsonResponse
from django.views import View
from actor.models import Actor, Movie

class ActorView(View) :
    def post(self, request) :
        data = json.loads(request.body)
        
        Actor.objects.create(
        		first_name    = data['first_name'],
                 	last_name     = data['last_name'],
                        date_of_birth = data['date_of_birth'])
                        
        return JsonResponse({'message' : 'created'}, status = 201)
        
    def get(self, request) :
        actors = Actor.objects.all()
        results = []
        for actor in actors :
            movie_list = [{'id'    : movie.id,
                           'title' : movie.title } for movie in actor.movies.all()]
            
            actor_name = actor.first_name + actor.last_name
            results.append({'name'   : actor_name,
              	  	    'movies' : movie_list })
                        
        return JsonResponse({'results' : results}, status = 200)
                        
class MovieView(View) :
    def post(self, request) :
        data = json.loads(request.body)
        
        if not Actor.objects.filter(id=data['actor_id']).exist() :
            return JsonResponse({'message' : 'actor_does_not_exists'}, status = 404)
            
        actor = Actor.objects.get(id=data['actor_id'])
        actor.movies.create(
        		title        = data['title'],
                	release_date = data['release_date'],
                        running_time     = data['running_time'])
                        
        return JsonResponse({'message' : 'created'}, status = 201)
        
    def get(self, request) :
        movies = Movie.objects.all()
        results = []
        for movie in movies :
            actor_list = [{'id'   : actor.id,
                  	   'name' : actor.last_name + actor.first_name }for actor in movie.actors.all() ]
            results.append({'title'        : movie.title,
              		    'running_time' : movie.running_time,
               		    'actors'       :  actor_list })
                                        
        return JsonResponse({'results' : results}, status = 200)                       		

๐Ÿ›  Review

manytomanyfield์˜ post์™€ get ๋ชจ๋‘ ์™„์„ฑ . .
์ฐธ์กฐ์™€ ์—ญ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ ธ๋‹ค. ํŠนํžˆ ์ œ์ผ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„์€
MovieView์˜ post์˜€๋‹ค .. ^^
Movie.objects.create()๊ฐ€ ์•„๋‹Œ ์—ญ์ฐธ์กฐ(actor.movies.create)๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

# http request message
http -v POST 127.0.0.1:8000/movies title='๋ฐ€์ •' release_date=2016-09-27' running_time=140 actor_id=6

#์‹คํŒจํ•œ ์ฝ”๋“œ
Movie.objects.create(
			title 	     = data['title'],
            		release_date = data['release_date'],
                    	running_time = data['running_time'],
                        actor_id     = data['actor_id'] )



#์„ฑ๊ณตํ•œ ์ฝ”๋“œ
actor = Actor.objects.get(id=data['actor_id']
actor.movies.create(
			title	     = data['title'],
            		release_date = data['release_date'],
                    	running_time = data['running_time'])

MovieView ํด๋ž˜์Šค์˜ post ํ•จ์ˆ˜๋Š” ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์‘๋‹ต๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค. (์ •๋ ฌ์€ ์™œ ๋ผ์žˆ๋Š”๊ฑฐ์ง€ ..?)

์ด์™ธ์—๋„ ์„ฑ๊ณผ ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ์ž‘์—…์ด ์–ด๋ ค์› ๋‹ค. for๋ฌธ์„ ์œ„์น˜์‹œํ‚ค๊ธฐ๊ฐ€ ์• ๋งคํ•ด์ ธ์„œ ๊ณ ์ƒํ–ˆ๋‹ค.
get ํ•จ์ˆ˜์—์„œ list comprehension์„ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋” ์งง๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ธดํ•œ๋ฐ,
๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ๊ฒƒ ๊ฐ™์•„์„œ ๊ทธ๋ƒฅ ๋‘๊ธฐ๋กœ ํ–ˆ๋‹ค.
๋จธ๋ฆฌ๊ฐ€ ์•„ํ”ˆ๋งŒํผ ์™„์„ฑ์‹œ์ผฐ์„ ๋•Œ ์พŒ๊ฐ์ด ์—„์ฒญ๋‚œ . . ํฌ๋ฃจ๋“œ ๊ณผ์ œ์˜€๋‹ค.
๋นจ๋ฆฌ ์œ„์Šคํƒ€๊ทธ๋žจ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ณ ์‹ถ๋‹ค .. ํ•˜ํ•˜

profile
Make my day !

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN