Docker 및 프로젝트 설정은 섹션3 앞부분을 참고해주세요.
#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__"
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
settings.py에 다음을 추가하여 pagination을 할 수 있습니다.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 3
}