주니어 데이터 엔지니어 우솨's 개발일지

유저(User)와 기능(투표, 질문) 본문

Django

유저(User)와 기능(투표, 질문)

우솨 2024. 4. 28. 13:12

user추가하기
polls.models.py
owner = models.ForeignKey('auth.User', related_name='questions', on_delete=models.CASCADE, null=True)

 

RelatedField

polls_api/serializers.py

questions = serializers.PrimaryKeyRelatedField(many=True, queryset=Question.objects.all())

유저 질문이 프라이머리키(id)로 나옴

questions = serializers.StringRelatedField(many=True, read_only=True)

 

유저 질문이 string method로 나옴

 

questions = serializers.SlugRelatedField(many=True, read_only=True, slug_field='pub_date')

필드중 아무거나 정해서 그 내용을 표시(이번엔 pubdate로 지정)

questions = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='question-detail')

 

유저 질문이 하이퍼 링크를 제공

투표기능 만들기
polls/models.py

class Vote(models.Model) :
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice = models.ForeignKey(Choice, on_delete=models.CASCADE)
    voter = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta :
        constraints = [ models.UniqueConstraint(fields=['question', 'voter'], name = 'unique_voter_for_questions')]

#투표된 갯수를 알려줌
polls_api/serializers.py
class ChoiceSerializer(serializers.ModelSerializer) :
    votes_count = serializers.SerializerMethodField()

    class Meta :
        model = Choice
        fields = ['choice_text','votes_count']

    def get_votes_count(self, obj) :
        return obj.vote_set.count()


polls_api/views.py

#내가 작성한 vote들만 보여주는 기능
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]

 


vote의 url 설정

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

polls.api/urls.py

'Django' 카테고리의 다른 글

Django 기본  (0) 2024.04.28
테스트 기능(Test)  (0) 2024.04.28
시리얼라이저(Serializer)와 에러(Error)  (0) 2024.04.28
뷰(View)와 템플릿(template)  (1) 2024.04.28