섹션 4: Django REST Framework - Level Two

천호영·2021년 6월 11일

Docker 및 프로젝트 설정은 섹션3 앞부분을 참고해주세요.

EbooksAPI - Project Setup

#ebooks/models.py

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

# Create your models here.


class Ebook(models.Model):
    title = models.CharField(max_length=140)
    author = models.CharField(max_length=60)
    description = models.TextField()
    publication_date = models.DateField()

    def __str__(self):
        return self.title


class Review(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    review_author = models.CharField(max_length=8, blank=True, null=True)
    review = models.TextField(blank=True, null=True)
    rating = models.PositiveIntegerField(
        validators=[MinValueValidator(1), MaxValueValidator(5)])

    ebook = models.ForeignKey(
        Ebook, on_delete=models.CASCADE, related_name="reviews")

    def __str__(self):
        return str(self.rating)
#ebooks/admin.py

from django.contrib import admin
from ebooks.models import Ebook, Review
# Register your models here.

admin.site.register(Ebook)
admin.site.register(Review)
#ebooks/api/serializers.py

from rest_framework import serializers
from ebooks.models import Ebook, Review


class ReviewSerializer(serializers.ModelSerializer):

    class Meta:
        model = Review
        fields = "__all__"


class EbookSerializer(serializers.ModelSerializer):
    reviews = ReviewSerializer(many=True, read_only=True)

    class Meta:
        model = Ebook
        fields = "__all__"

The GenericAPIView Class and Mixins

Concrete View Classes

The Permissions System - Part One

settings.py에 permission설정을 하여 전체 권한을 설정할 수 있습니다.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ]
}

하지만, 전체가 아닌 view마다 설정해줄수도 있습니다.

class EbookListCreateAPIView(generics.ListCreateAPIView):
    queryset = Ebook.objects.all()
    serializer_class = EbookSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

urls.py에 api-auth을 추가하면, drf 자체 템플릿에 로그인,로그아웃이 구현됩니다.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls')),
    path('api/', include("ebooks.api.urls")),
]

permission class를 직접 만들어서 적용할수도 있습니다.

from rest_framework import permissions

class IsAdminUserOrReadOnly(permissions.IsAdminUser):
    def has_permission(self, request, view):
        is_admin = super().has_permission(request, view)
        return request.method in permissions.SAFE_METHODS or is_admin

The Permissions System - Part Two

Pagination in Django REST Framework

settings.py에 다음을 추가하여 pagination을 할 수 있습니다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 3
}

0개의 댓글