๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง

๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง 2022.04.22.๊ธˆ

by DevIseo 2022. 4. 22.

์˜ค๋Š˜์€ M:N์„ ์ด์šฉํ•˜๊ณ  REST API๋ฅผ ํ™œ์šฉํ•œ ํŽ˜์ด์ง€ ๊ตฌํ˜„์„ ํ•˜์˜€๋‹ค.

์‚ฌ์‹ค M:N์˜ ๊ฐœ๋…์ด ์•„์ง ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฝ๋˜์ง€ ์•Š์•„์„œ models.py์™€ serializers.py๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ํž˜๋“ค์—ˆ๋‹ค.

๋˜ํ•œ,

python manage.py loaddata movies/actors.json movies/movies.json movies/reviews.json

ํ•  ๋•Œ ๊ณ„์† ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค. ๊ทธ๋ž˜์„œ models.py ๋ถ€๋ถ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ–ˆ๋‹ค.

from django.db import models

# Create your models here.
class Actor(models.Model):
    name = models.CharField(max_length=100)
class Movie(models.Model):
    title = models.CharField(max_length=100)
    overview = models.TextField()
    release_date = models.DateTimeField()
    poster_path = models.TextField()
    actors = models.ManyToManyField(Actor,related_name='actors')



class Review(models.Model):
    title = models.CharField(max_length=100) 
    content = models.TextField()
    movie = models.ForeignKey(Movie,on_delete=models.CASCADE)

์œ„์˜ ์˜ค๋ฅ˜๋ฅผ ๊ณ ์น˜๊ณ  admin์„ ๋“ฑ๋กํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ๋˜ ํ•œ ๋ฒˆ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฌ๋‹ค. 
๋ชจ๋ธ์— ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒƒ๋“ค์„ callํ•ด์˜ฌ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฌ๋‹ค. 
์ฒ˜์Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ ์—ˆ์—ˆ๋‹ค.

from django.db import models
# Create your models here.

class Actor(models.Model):
    name = models.CharField(max_length=100)
class Movie(models.Model):
    title = models.CharField(max_length=100)
    overview = models.TextField()
    release_date = models.DateTimeField()
    poster_path = models.TextField()
    actors = models.ManyToManyField(Actor,related_name='movies')



class Review(models.Model):
    title = models.CharField(max_length=100) 
    content = models.TextField()
    movie = models.ForeignKey(Movie,on_delete=models.CASCADE)

๊ทธ๋ž˜์„œ ์ด ๊ตฌ๋ฌธ์ด ์ž˜๋ชป ๋˜์—ˆ์Œ์„ ์ธ์ง€ํ–ˆ๋‹ค. 
์–ด์ฐจํ”ผ ๋ชจ๋ธ์„ ๋‹ค ๋ถˆ๋Ÿฌ์˜ฌ๊ฑฐ๋‹ˆ๊นŒ model๋“ฑ๋ก์„ ๋‹ค ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊พธ๋‹ˆ ์„œ๋ฒ„๋„ ์ œ๋Œ€๋กœ ์ผœ์ง€๊ณ  admin ์‚ฌ์ดํŠธ๋„ ์ œ๋Œ€๋กœ ๋˜์—ˆ๋‹ค.

from django.contrib import admin
from .models import Movie,Actor,Review

# Register your models here

admin.site.register(Actor)
admin.site.register(Movie)
admin.site.register(Review)

๊ทธ๋ž˜์„œ ์ด ๊ตฌ๋ฌธ์ด ์ž˜๋ชป ๋˜์—ˆ์Œ์„ ์ธ์ง€ํ–ˆ๋‹ค. 
์–ด์ฐจํ”ผ ๋ชจ๋ธ์„ ๋‹ค ๋ถˆ๋Ÿฌ์˜ฌ๊ฑฐ๋‹ˆ๊นŒ model๋“ฑ๋ก์„ ๋‹ค ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊พธ๋‹ˆ ์„œ๋ฒ„๋„ ์ œ๋Œ€๋กœ ์ผœ์ง€๊ณ  admin ์‚ฌ์ดํŠธ๋„ ์ œ๋Œ€๋กœ ๋˜์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  detailํŽ˜์ด์ง€์—์„œ ์˜ํ™” ๋ฐฐ์šฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์˜ํ™”๋ฐฐ์šฐ์˜ ์˜ํ™”๋ชฉ๋ก์ด ๋‚˜์™€์•ผํ•˜๋Š”๋ฐ ์ž˜ ๋‚˜์˜ค์ง€ ์•Š์•„์„œ ๋งค์šฐ ํž˜๋“ค์—ˆ๋‹ค. 
serializers.py๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์–ด ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 
class๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ๋‚ด๊ฐ€ ๋ถˆ๋Ÿฌ์˜ค๊ณ ์ž ํ•œ๊ฑฐ๋ฅผ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

from rest_framework import serializers
from .models import *

class ActorListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Actor
        fields = ('id' , 'name')

class MovieListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Movie
        fields = ('title','overview')



class ActorSerializer(serializers.ModelSerializer):
    movies = MovieListSerializer(many = True, read_only = True)
    
    class Meta:
        model = Actor
        fields = ('id','movies','name')


class MovieSerializer_actor(serializers.ModelSerializer):
    class Meta:
        model = Actor
        fields = ('name',)

class MovieSerializer(serializers.ModelSerializer):

    actors = MovieSerializer_actor(many = True, read_only = True)
    class Meta:
        model = Movie
        fields = '__all__'


class ReviewListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = ('title','content')


class ReviewSerializer_movie(serializers.ModelSerializer):
    class Meta:
        model = Movie
        fields = ('title',)


class ReviewSerializer(serializers.ModelSerializer):
    movie = ReviewSerializer_movie(read_only=True)
    class Meta:
        model = Review
        fields = '__all__'

์ด์ „์—๋Š” Django REST Framework์˜ 1:N ๊ด€๊ณ„๊นŒ์ง€๋ฐฐ์› ๋‹ค๋ฉด ์˜ค๋Š˜์€ M:N ๊ด€๊ณ„๋ฅผ ์ด์šฉํ•ด์„œ Manytofield๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์—ˆ๋‹ค. 
์•„์ง ์ด ๋ถ€๋ถ„์€ ๋‚˜์—๊ฒŒ ์ข€ ์–ด๋ ค์šด ๊ฑฐ ๊ฐ™์•„ ์ฃผ๋ง ๋™์•ˆ ๊ณต๋ถ€๋ฅผ ๋” ํ•ด๋ด์•ผ๊ฒ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€์ˆ˜๋ช…์„ ์ž˜ ์ ์–ด์ฃผ์–ด์•ผ๊ฒ ๋‹ค.... 
pk๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ `s`ํ•˜๋‚˜ ๋นผ๋จน์–ด์„œ ์˜ค๋ฅ˜ ์ฐฝ์ด ๊ณ„์† ๋งŒ๋‚ฌ๋‹ค. 
์˜ค๋Š˜ ๊ณผ์ • ํ•˜๋‚˜ํ•˜๋‚˜๋งˆ๋‹ค ์˜ค๋ฅ˜ ์ฐฝ์„๋งŒ๋‚ฌ๋Š”๋ฐ ์•„์ง๋„ ์˜ค๋ฅ˜ ์ฐฝ์ด ํฌ๊ฒŒ ๋ฐ˜๊ฐ‘์ง€๋Š” ์•Š์ง€๋งŒ ์˜ค๋ฅ˜๋ฅผ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐˆ ๋•Œ๋งˆ๋‹ค ๋ฟŒ๋“ฏํ•จ์ด ๋Š๊ปด์ง„๋‹ค.

๋Œ“๊ธ€