DRF - Post API

OneDayDev·2022년 11월 30일
0

Django

목록 보기
4/14
post-thumbnail

게시글 App

python manage.py startapp posts 후 settings.py에 등록

Model

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE,)
    title = models.CharField(max_length=128)
    body = models.TextField()
    image = models.ImageField(upload_to='post/', default='default.png')
    published_date = models.DateTimeField(default=timezone.now)

Serializer

from rest_framework import serializers

from .models import *


class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('pk','title','body','image','published_date')


class PostCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('title','body','image')

Permission

from rest_framework import permissions


class CustomReadOnly(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.method == 'GET':
            return True
        return request.user.is_authenticated

    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.author == request.user

View

from rest_framework import viewsets

from .models import *
from .permissions import *
from .serializers import *


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    permission_classes = [CustomReadOnly]

    def get_serializer_class(self):
        if self.action == 'list' or 'retrieve':
            return PostSerializer
        return PostCreateSerializer

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

URL

from django.urls import path
from rest_framework import routers

from .views import PostViewSet

router = routers.SimpleRouter()
router.register('posts', PostViewSet)

urlpatterns = router.urls

Test

from requests_toolbelt import MultipartEncoder
import requests

endpoint = "http://127.0.0.1:8000/posts/"

mp_encoder = MultipartEncoder(
    fields={
        'title':'post test',
        'body':'post test is it work?'
    }
)
r = requests.post(
    endpoint,
    data=mp_encoder,
    headers={'Content-Type': mp_encoder.content_type,'Authorization': 'Token <Token>'}
)
profile
안녕하세요.

0개의 댓글