본문 바로가기
Django/Django Rest Framework

8. Django DRF rest api에 대한 이해

by S.T.Lee 2022. 6. 18.

http method 종류

  • get : 조회
  • post : 생성
  • put : 수정
  • delete : 삭제

 

FBV vs CBV

FBV : Function Base View

CBV : Class Base View

 

FBV

def user(request):
	if request.method == 'post':
    	pass
    if request.method == 'get':
    	pass

 

CBV

from rest_framework.views import APIView
from rest_framework import permissions
from rest_framework.response import Response
class UserView(APIView):
    #권한 설정
    #모두 #추가 설정을 안하면 default값이다
    permission_classes = [permissions.AllowAny]
    #로그인한 사람만
    permission_classes = [permissions.IsAuthenticated]
    #admin만
    permission_classes = [permissions.IsAdminUser]
    def get(self, request):
    	#그전까지는 하단의 render를 많이 사용하였으나 이제는
        return render("~.html", {'data': 'userdata~'}
        #response를 사용할것
        return Response({'message':'get method!'})
    def post(self, request):	
	return Response({'message':'post method!'})
    def put(self, request):
	return Response({'message':'put method!'})
    def delete(self, request):
	return Response({'message':'delete method!'})

이제 urls.py에서

from django.contrib import admin
from django.urls import path
from user import views


urlpatterns = [
    path('', views.UserView.as_view())
]

를 해주는데 CBV는 as_view()를 무조건 붙쳐줘야한다.

참조 Django 공식 문서 - https://docs.djangoproject.com/en/4.0/topics/class-based-views/

 

Class-based views | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

만약 IsAuthenticated를 했는데 로그인 안하고 실행하면

{
    "detail": "Authentication credentials were not provided."
}

하단과 같은 에러를 Postman에서 볼 수 있다.

 

Using PostMan

https://softl.tistory.com/147

 

Postman 실행

1. WorkSpace 프로젝트마다의 독립된 공간으로 팀원들간 공유가 가능하다. New Workspace를 통해 만들 수 있다. 2. Collections 세부 카테고리를 정하는 곳 add request를 통해 'GET 사용자 조회' 와 같은 api를..

softl.tistory.com

 

object&queryset

  • object : 테이블에 입력 된 특정 레코드
  • queryset : object의 집합 ex) [object(1), object(2), object(3)]
Model.objects.get(id=obj_id) # => return object
Model.objects.filter(date=datetime.today()) # => return queryset

 

데이터 추가, 조회, 삭제, 수정하기

# 추가1
model = Model(
	field1="value1",
  field2="value2"
)
model.save()

# 추가2
Model.objects.create(
  field1="value1",
  field2="value2"
)

# 조회
Model.objects.all()
Model.objects.filter()
Model.objects.get()

# 수정1
model = Model.object.get(id=obj_id)
model.field = value
model.save()

# 수정2
Model.objects.filter(field__contains=value).update(
    field1="value1",
    field2="value2"
)

# 삭제
Model.objects.filter(field="value").delete()
Model.objects.get(id=obj_id).delete()

 

자주 사용하는 패턴

# objects.get에서 객체가 존재하지 않을 경우 DoesNotExist Exception 발생
try:
    Model.objects.get(id=obj_id)
except Model.DoesNotExist:
    # some event
    return Response("존재하지 않는 오브젝트입니다.")

# -join_date처럼 "-"를 붙이면 역순으로 정렬
# .order_by("?")사용시 무작위 셔플
Model.objects.all().order_by("join_date") 

# queryset에서 첫번째 object를 가져옴. all()[0]과 동일
Model.objects.all().first()

# 입력한 object가 존재 할 경우 해당 object를 가져오고, 존재하지 않을 경우 새로 생성
object, created = Model.objects.get_or_create(
    field1="value1",
    field2="value2",
)

if created: 
    # created event
else: 
    # already exist event