터칭 데이터

장고(Django) 투표(Votes) 기능 구현하기 2 - Serializers & Views 본문

장고 (Django)

장고(Django) 투표(Votes) 기능 구현하기 2 - Serializers & Views

터칭 데이터 2023. 11. 5. 19:39

 

 

 

Vote의 상세 페이지를 만들어 그 곳에서 로그인한 사용자가 투표를 하거나 자신이 한 투표들을 조회하고 이미 진행한 투표를 다른 곳에 행사하도록 수정하는 기능을 구현하겠습니다.

 

 

polls_api/serializers.py

from polls.models import Question,Choice, Vote

class VoteSerializer(serializers.ModelSerializer):    
    voter = serializers.ReadOnlyField(source='voter.username')
        
    class Meta:
        model = Vote
        fields = ['id', 'question', 'choice', 'voter']

 

 

 

 

 

polls_api/views.py

from polls.models import Question, Choice, Vote
from .serializers import *
class VoteList(generics.ListCreateAPIView):
    serializer_class = VoteSerializer
    permission_classes = [permissions.IsAuthenticated]
    
    def get_queryset(self, *args, **kwargs):
        return Vote.objects.filter(voter=self.request.user)
    
    def perform_create(self, serializer):
        serializer.save(voter=self.request.user)

class VoteDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Vote.objects.all()
    serializer_class = VoteSerializer
    permission_classes = [permissions.IsAuthenticated, IsVoter]

 

IsVoter가 생소하실 수 있는데 우리가 직접 만들 permissions 클래스 입니다.

 

 

 

polls_api/permissions.py

class IsVoter(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.voter == request.user

 

기존의 IsOwnerOrReadOnly는 사용자가 아니면 조회만 가능하도록 하는 기능입니다. 그런데 이번에 자기 자신의 투표결과를 조회할 수 있는 것은 로그인한 본인이어야 합니다. 다른 사람이 자신의 투표를 볼 수 없도록 해야합니다. 그래서 투표자 본인인지 permissions로 IsVoter 클래스를 만들었습니다.

 

 

 

polls_api/urls.py

from .views import *

urlpatterns = [
    ...
    path('vote/', VoteList.as_view()),
    path('vote/<int:pk>/', VoteDetail.as_view()),
]

 

뷰에서 새로 만든 기능들도 URL 패턴으로 추가합니다.

 

 

 

IsVoter를 제외하고는 그동안 우리가 배워온 과정들의 복습입니다.

 

 

 

 

 

 

브라우저에서 user1으로 로그인하고 Vote List로 들어가보니 user1으로서 그동안 행사한 투표 결과를 볼 수 있습니다.

 

 

 

 

 

detail/숫자id URL로 더 상세히 들어가면 자신이 행사한 투표 결과를 수정할 수도 있습니다.