[DRF] <Level One> Django REST Framework - JobBoardAPI

Alex of the year 2020 & 2021·2020년 8월 29일
1

Django Rest Framework

목록 보기
4/15
post-thumbnail

사실 원래 터미널을 사용하여 장고를 다루는 편인데 이번에 수강하고 있는 유데미 강좌에서 VS Code를 적극 활용한다.
따라서 이번에는 나도 VS Code를 사용하였다.

CRUD 게시판 만들어보기

조건 1. Django Project 'JobBoard' (the website like indeed.com)
조건 2. api/jobs/ : accepts GET & POST methods, allowing to create new instances and retrieve a list with all the available job offer instances
조건 3. api/jobs/<int:pk>/ accepts GET, PUT, and DELETE, allowing a user to retrieve, update or delete an object instance.
조건 4: [app_name]/api/views.py --> @api_view decorator or the APIView class
조건 5: Serializer --> using the homonym class or the ModelSerializer
조건 6 : No authentication system required
조건 7: Only one model is needed for the project - 'JobOffer'

JobOffer

  • company_name
  • company_email
  • job_title
  • job_description
  • salary
  • city
  • state
  • created_at
  • available

실제 진행한 순서

  1. (터미널에서) django-admin startproject JobBoard 로 프로젝트를 만들어준다. ("job_board"가 나았을 것 같다.)
  2. (터미널에서) JobBoard 프로젝트의 manage.py 단에서 python manage.py startapp job 로 job 앱 만들기 (강의에서는 'jobs'로 만들었다.)
  3. (VS Code로 넘어와서) JobBoard/JobBoard/settings.py : INSTALLED_APPS에 rest_framework, job 추가
  4. job/models.py 작성 : JobOffer 테이블 작성
from django.db import models


class JobOffer(models.Model):
    company_name = models.CharField(max_length=20) #강의에서는 50
    company_email = models.EmailField(max_length=120) #강의에서는 max_length 작성하지 않음
    job_title = models.CharField(max_length=20) #강의에서는 60
    job_description = models.TextField(max_length=200)
    salary = models.FloatField() #강의에서는 PositiveIntegerField()로 작성
    city = models.CharField(max_length=20) #강의에서는 35
    state = models.CharField(max_length=20) #강의에서는 35
    available = models.BooleanField(default=True)
    #created_at = models.DateField(auto_now_add=True)
    # 나는 깜빡잊고 created_at을 빼먹었다 핫..


    def __str__(self):
        return f"{ self.company_name } { self.job_title }" 
        # 강의에서는 return self.company_name이라고 했지만 나는 타이틀까지 주고 싶었다
  1. python manage.py makemigrations --> python manage.py migrate 진행
  2. python manage.py createsuperuser 하여 admin 계정 생성
  3. JobBoard/job/admin.py 작성
from django.contrib import admin
from job.models import JobOffer

admin.site.register(JobOffer)
# admin 페이지에서 models.py에 작성한 모델을 기반으로 add, save 등을 가능하게 해준다.
# 만약 models.py에 여러 개의 모델을 작성했을 경우에는 이 admin.site.register([테이블이름])도 여러 개 적을 수 있다.
  1. 이제 127.0.01:8000/admin 접속 시, job에 job을 추가할 수 있다.


Job offers로 들어가면
이렇게 내가 미리 추가해둔 회사명(A, C)과 직업명이 보인다.
(원래 B도 있었는데 delete 하는 과정에서 사라졌다.)

  1. 여기까지 한 다음 이제 api관련한 문서를 작성해야 하기에 api 폴더를 만들고, 그 안에
    serializers.py, views.py, urls.py 를 만들어준다.
    (DRF에서 serializer를 사용할 때는 이렇게 api폴더를 따로 빼서 만드는 것이 일반적인 것 같다.)

  1. serializers.py를 열어 다음을 쓴다. 나는 ModelSerializer를 사용했는데, 이 강의에서도 모범 답안으로 ModelSerializer를 사용했다.
from rest_framework import serializers
from job.models import JobOffer


class JobOfferSerializer(serializers.ModelSerializer):

    class Meta:
        model = JobOffer
        fields = "__all__"
  1. views.py를 열어 다음을 쓴다.
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.generics import get_object_or_404

from job.models import JobOffer
from job.api.serializers import JobOfferSerializer

class JobOfferListAPIView(APIView): #강의에서는 JobOfferListCreateAPIView라고 이름을 붙였는데 나는 Create를 빼는 것이 맞다고 생각한다.
    def get(self, request):
        jobs = JobOffer.objects.all() #강의에서는 .filter(available=True)로 했는데, 생각해보니 그렇게 쓰는 편이 좋겠다.
        serializer = JobOfferSerializer(jobs, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = JobOfferSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class JobOfferDetailAPIView(APIView):
    def get_object(self, pk):
        job = get_object_or_404(JobOffer, pk=pk)
        return job

    def get(self, request, pk):
        job = self.get_object(pk)
        serializer = JobOfferSerializer(job)
        return Response(serializer.data)

    def put(self, request, pk):
        job = self.get_object(pk)
        serializer = JobOfferSerializer(job, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        job = self.get_object(pk)
        job.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
  1. urls.py에는 다음을 쓴다.
from django.urls import path
from job.api.views import JobOfferListAPIView, JobOfferDetailAPIView

urlpatterns = [
    path('jobs/', JobOfferListAPIView.as_view(),
         name='jobs-list'),

    path('jobs/<int:pk>/', JobOfferDetailAPIView.as_view(),
         name='jobs-detail'),
]
  1. JobBoard/JobBoard/urls.py도 수정해준다.
from django.contrib import admin
from django.urls import path, include #2) include 추가 import 하고

urlpatterns = [
    path('admin/', admin.site.urls), #1) 원래 여기까지만 적혀있지만
    path('api/', include('job.api.urls')) #3) 엔드포인트에 'job.api.urls'를 추가한다.
]
  1. 이후 크롬에 접속하면 내가 의도한 모든 기능(Jobs list 보여주기, list 추가하기 / Job detail 보여주기, detail 수정하기, detail 페이지에서 해당 객체 삭제하기)이 모두 작성한다.


references:
UDEMY course 'The Complete Guide to Django REST Framework and Vue JS'
https://www.udemy.com/course/the-complete-guide-to-django-rest-framework-and-vue-js/

profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글