Todo 리스트

  • 게시글을 전부 불러와 보여질 페이지
  • 여러개의 시리얼라이즈를 불러올 때 many=True를 사용

(app - models.py )

from django.db import models
from user.models import Users


class Todos(models.Model):
    user = models.ForeignKey(Users, on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    # 파일 찾기 기능을 고려해 시간대별 저장
    image = models.ImageField(blank=True, upload_to='%Y/%m/%d/')
    is_complete = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    completion_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.title)

 

(app - views.py)

from rest_framework.permissions import IsAuthenticated
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from todo.models import Todos      
from todo.serializers import TodoSerialize


class TodoView(APIView):
    # 로그인한 유저인지 확인
    permission_classes = [IsAuthenticated]
    def get(self, request):
        todo = Todos.objects.all()
        # 여러개의 시리얼라이즈를 불러올 때 many=True를 사용
        serialize = TodoSerialize(todo, many=True)
        return Response(serialize.data, status=status.HTTP_200_OK)

 

(app - serializers.py)

from rest_framework import serializers
from todo.models import Todos

class TodoSerialize(serializers.ModelSerializer):
    class Meta:
        model = Todos
        fields = '__all__'

 

 

 

 

 

 

Todo 생성

  • 게시글 작성은 title과 image 데이터만 받음
  • user는 데이터를 실어온 시리얼라이즈에 로그인한 유저의 정보를 추가하여 저장

 

(app - views.py)

from todo.serializers import TodoCreateSerialize

class TodoView(APIView):
    def post(self, request):
        serialize = TodoCreateSerialize(data=request.data)
        if serialize.is_valid():
            # user를 저장하지 않으면 에러남
            serialize.validated_data['user'] = request.user
            serialize.save()
            # 또는 아래와 같이 유저를 저장할 수 있다.
            # serialize.save(user=request.user)
            return Response(serialize.data, status=status.HTTP_201_CREATED)
        else:
            return Response({'message':f'${serialize.errors}'}, status=status.HTTP_400_BAD_REQUEST)

 

(app - serializers.py)

class TodoCreateSerialize(serializers.ModelSerializer):
    class Meta:
        model = Todos
        fields = ['title', 'image']

 

https://www.django-rest-framework.org/api-guide/fields/

 

 

 

 

 

Todo 수정, 삭제하기

  • 개인페이지의 열람, 수정, 삭제는 로그인한 유저와 게시글을 쓴 유저의 정보가 일치할 때만 가능
  • 객체가 존재하지 않으면 404 에러를 발생

 

(app - views.py)

class TodoDetailView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, todo_id):
        # 객체가 존재하지 않으면 404에러를 발생
        todo = get_object_or_404(Todos, id=todo_id)
        if request.user == todo.user:
            serialize = TodoSerialize(todo)
            return Response(serialize.data, status=status.HTTP_200_OK)
        else:
            return Response({'message':'권한이 없습니다.'}, status=status.HTTP_400_BAD_REQUEST)
    
    def put(self, request, todo_id):
        todo = get_object_or_404(Todos, id=todo_id)
        if request.user == todo.user:
            serialize = TodoCreateSerialize(todo, data=request.data)
            if serialize.is_valid():
                serialize.save()
                return Response(serialize.data, status=status.HTTP_200_OK)
            else:
                return Response({'message':'데이터가 옳바르지 않습니다.'}, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response({'message':'권한이 없습니다.'}, status=status.HTTP_400_BAD_REQUEST)   
    
    def delete(self, request, todo_id):
        todo = get_object_or_404(Todos, id=todo_id)
        if request.user == todo.user:
            todo.delete()
            return Response({'message':'삭제 완료'},status=status.HTTP_204_NO_CONTENT)
        else:
            return Response({'message':'권한이 없습니다.'}, status=status.HTTP_400_BAD_REQUEST)

 

 

 

 

 

 

 

 

+) 시리얼라이즈를 활용( get_user 메소드 )하여 user를 보여줄 때 email로 보여줄 수 있다.

from rest_framework import serializers
from todo.models import Todos


class TodoSerialize(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    # user attribute(변수) 앞에 get을 사용
    # obj는 해당 Article
    def get_user(self, obj):
        # return 값이 user라는 attribute 값에 들어감
        return obj.user.email
        
    class Meta:
        model = Todos
        fields = '__all__'

 

+ Recent posts