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 |