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?
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.