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__'
'Python > Django' 카테고리의 다른 글
[DRF] 12. 좋아요, 팔로우 (1) | 2023.04.26 |
---|---|
[DRF] 11. 댓글 API(두 개의 모델 참조) (0) | 2023.04.26 |
[DRF] 09. 스태틱, 미디어 폴더 세팅 (0) | 2023.04.26 |
[DRF] 08.5 토큰 주기설정, permission (0) | 2023.04.26 |
[DRF] 08. Payload 커스텀 (0) | 2023.04.26 |