Search code examples
djangodjango-rest-frameworkdjango-serializer

Trying to find out total no of votes, but could not understand how it is done in serializers. I'm new to django, How is it done?


Here is my model :

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
    answer = models.CharField(max_length=1000, default="", blank=False)
    author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    createdAt = models.DateTimeField(auto_now_add=True)
    upVotes = models.IntegerField(default=0)
    downVotes = models.IntegerField(default=0)

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

Here is the serializer:

class AnswerSerializer(serializers.ModelSerializer):

    votes = serializers.SerializerMethodField(method_name='get_votes', read_only=True)
    class Meta:
        model = Answer
        fields = ('id', 'question', 'answer', 'author', 'createdAt', 'votes')

    def get_votes(self, obj):
        if obj.upVotes and obj.downVotes:
            total_votes = (obj.upVotes + obj.downVotes)
            return total_votes

Here is my upVote view :

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def upvote(request, pk):
    answer = get_object_or_404(Answer, id=pk)
    author=request.user
    voter = upVote.objects.filter(author=author, answer=answer)        
    if voter.exists():
        return Response({
            'details':'You cannot vote twice'
        })
    else:
        upVote.objects.create(
            answer=answer,
            author=author
        )
        answer.upVotes += 1
        answer.save()
        return Response({
            'details':'Vote added'
        })

How to find total number of votes and that should be directed to answers model. How to do this kind of operations in serializers?


Solution

  • def get_votes(self, obj):
        total_votes = 0
        if obj.upVotes is not None and obj.downVotes is not None:
            total_votes = (obj.upVotes + obj.downVotes)
            return total_votes
    

    thats happening because either upvote or downvote is none. you can do this.