사실 원래 터미널을 사용하여 장고를 다루는 편인데 이번에 수강하고 있는 유데미 강좌에서 VS Code를 적극 활용한다.
따라서 이번에는 나도 VS Code를 사용하였다.
조건 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
django-admin startproject JobBoard
로 프로젝트를 만들어준다. ("job_board"가 나았을 것 같다.)python manage.py startapp job
로 job 앱 만들기 (강의에서는 'jobs'로 만들었다.)JobBoard/JobBoard/settings.py
: INSTALLED_APPS에 rest_framework
, job
추가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이라고 했지만 나는 타이틀까지 주고 싶었다
python manage.py makemigrations
--> python manage.py migrate
진행python manage.py createsuperuser
하여 admin 계정 생성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([테이블이름])도 여러 개 적을 수 있다.
Job offers로 들어가면
이렇게 내가 미리 추가해둔 회사명(A, C)과 직업명이 보인다.
(원래 B도 있었는데 delete 하는 과정에서 사라졌다.)
serializers.py
, views.py
, urls.py
를 만들어준다.from rest_framework import serializers
from job.models import JobOffer
class JobOfferSerializer(serializers.ModelSerializer):
class Meta:
model = JobOffer
fields = "__all__"
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)
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'),
]
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'를 추가한다.
]
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/