새 프로젝트 생성
pip install django
django-admin startproject config .
pip install djangorestframework
pip install markdown # Markdown support for the browsable API.
pip install django-filter # Filtering support
settings.py에 추가
INSTALLED_APPS = [
...
'rest_framework',
]
urls.py
urlpatterns = [
...
path('api-auth/', include('rest_framework.urls'))
]
서버 실행 후
http://127.0.0.1:8000/api-auth/login/
로 확인. 뒤에 / 붙여야 뜸
앱 만들기
python .\manage.py startapp product
모델 만들기
from django.db import models
# Create your models here.
class Product(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
price = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
앱 안에 파이썬 파일 생성
serializer.py
from rest_framework import serializers
from product.models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__' # 전부다 넣고싶을 때, 각각 넣으려면 [ ]
메타데이터 - 데이터에 대한 데이터
views.py
from rest_framework import viewsets
from product.models import Product
from product.serializer import ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
url
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls')),
path('', include('product.urls')),
]
product폴더 안에 urls.py 만들기
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
import product.views
router = DefaultRouter()
router.register('product', product.views.ProductViewSet) # viewset이 만든 여러 메소드의 url을 만들어줌
urlpatterns = [
path('', include(router.urls))
]
url 순서 : configurl등록-product url 등록-router url
검색 시 http://127.0.0.1:8000/product/ (뒤에 슬래시 잊지말기)
만약 config url에서 ‘abc’, product url이 ‘def’, router을 ‘ghi’로 했다면 주소창에는 ~~~/abc/def/ghi/ 로 검색
관리자에 product 등록 - admin.py (장고에서배운거)
from product.models import Product
admin.site.register(Product)
127.~~/product/1/ 이런식으로 하면 1번거 볼 수 있음. 장고 admin에서 상품추가 가능
https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo 이걸 이용해 할 것임 요청 보내고 할 수 있음
(postman)도 있음
views.py 내용 작성
from rest_framework import viewsets
from product.models import Product
from product.serializer import ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def get_queryset(self):
qs = super().get_queryset() # 부모 거 그대로 가져온 것
search_name = self.request.query_params.get('name',) # 장고에서의 request.GET.get('name') 와 같은 것
if search_name:
qs = qs.filter(name=search_name)
return qs
def get_queryset(self):
qs = super().get_queryset() # 부모 거 그대로 가져온 것
search_name = self.request.query_params.get('name',) # 장고에서의 request.GET.get('name') 와 같은 것것
if search_name:
qs = qs.filter(name__contains=search_name)
return qs
def get_queryset(self):
qs = super().get_queryset() # 부모 거 그대로 가져온 것
search_name = self.request.query_params.get('name',) # 장고에서의 request.GET.get('name') 와 같은 것것
if search_name:
qs = qs.filter(name__icontains=search_name)
return qs
views.py 클래스 안에서
@action(detail=False, methods=['get'], url_path="search/(?P<name>[^/.]+)") # 여러개면 detail False, method는 현재 우리는 get으로만 할거니까 get만 추가해놓음, url은 정규표현식으로 찾음. 슬래시로 시작하고 그 뒤에 아무거나 라는 뜻의 정규표현식
def search(self,request, name=None):
qs = self.get_queryset().filter(name__icontains=name) # name을 받아서 filter, 이건 상속오버라이딩 아님
serializer = self.get_serializer(qs, many=True)
return Response(serializer.data)
앱 생성
모델 생성
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
# Create your models here.
class Review(models.Model):
score = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(5)]) # 0최소값, 5최대값으로 설정해 리뷰 0~5점까지 받도록
contents = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
migrate
앱 안에 serializer.py 생성
from rest_framework import serializers
from review.models import Review
class ReviewSerializer(serializers.ModelSerializer):
class Meta:
model = Review
fields = '__all__'
views.py
from django.shortcuts import render
# Create your views here.
from rest_framework import viewsets
from review.models import Review
from review.serializer import ReviewSerializer
class ReviewViewSet(viewsets.ModelViewSet):
queryset = Review.objects.all()
serializer_class = ReviewSerializer
path('', include('review.urls')),
review 폴더에 urls.py 생성
from django.urls import include, path
from rest_framework.routers import DefaultRouter
import review.views
router = DefaultRouter()
router.register('review', review.views.ReviewViewSet)
urlpatterns = [
path('', include(router.urls))
]
admin에 추가
from django.contrib import admin
# Register your models here.
from review.models import Review
admin.site.register(Review)from django.urls import include, path
Advanced REST Client에서 실행해보기
ModelViewSet은 해당 5목록이 무조건 만들어지게 되는데, 기능 하나 또는 두개만 하고싶을 때는 ModelViewSet 말고 APIView를 상속받아 오면 됨.
ModelViewSet
APIView
views.py
from django.shortcuts import render
# Create your views here.
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from review.models import Review
from review.serializer import ReviewSerializer
class ReviewList(APIView):
def get(self, request):
qs = Review.objects.all()
serializer = ReviewSerializer(qs, many=True)
return Response(serializer.data)
def post(self, request):
serializer = ReviewSerializer(data=request.data, many=False) # 리스트로 여러개 작성할거면 many=True로 하면 됨. 리뷰에서는 2개 동시에 다는 일 없어서 False지만 상품 구매일때 여러개 살때는 True로 해도ㅗ 됨
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
class ReviewDetail(APIView):
# 목록 불러오기
def get(self, request, pk): # pk는 primary key
qs = Review.objects.get(id=pk)
serializer = ReviewSerializer(qs, many=False)
return Response(serializer.data)
def patch(self,request,pk):
qs = Review.objects.get(id=pk)
serializer = ReviewSerializer(qs, data=request.data, partial=True) # 모델속성 다 입력안해도 수정할 수 있게 주려면 partial
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):
qs = Review.objects.get(id=pk)
qs.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
reviews의 urls.py 설정
from django.urls import include, path
from rest_framework.routers import DefaultRouter
import review.views
urlpatterns = [
path('review/', review.views.ReviewList.as_view()),
path('review/<int:pk>',review.views.ReviewDetail.as_view())
]
목록 확인
목록 등록
목록 하나 확인
product
메소드 | URL | 설명 | 데이터 |
---|---|---|---|
GET | product/ | 목록 | X |
POST | product/ | 생성 | Product 모델 |
GET | product/[id]/ | 조회 | X |
PATCH | product/[id]/ | 수정 | Product 모델 |
DELETE | product/[id] | 삭제 | X |
GET | product/?name=[name] | 검색목록 | 쿼리 이용 |
---|---|---|---|
GET | product/search/[name] | 검색목록 | 함수 이용 |
review
모델 : score(별점), contents(내용)
메소드 | URL | 설명 | 데이터 |
---|---|---|---|
GET | review/ | 목록 | X |
POST | review/ | 생성 | Review 모델 |
GET | review/[id]/ | 조회 | X |
PATCH | review/[id]/ | 수정 | Review 모델 |
DELETE | review/[id] | 삭제 | X |