Я пытаюсь проголосовать за комментарии в моем сериализаторе. Кажется, что все работает хорошо с частью голосования.
Однако сериализатор возвращает старые значения, а не обновленные значения.
Я знаю, что делаю что-то не так, просто не знаю, как это сделать. сложите все вместе, чтобы вернуть недавнее значение через $ ajax после того, как будет записано голосование за комментарий.
Примечание: Когда я обновлю sh страницу, Я получил правильное количество голосов.
Вот мой view.py, который записывает голоса:
class CommentUpdateAPIView(DestroyModelMixin, generics.RetrieveUpdateAPIView):
queryset = Comment.objects.all()
serializer_class = CommentUpdateSerializer
permission_classes = [IsOwnerOrReadOnly]
def perform_update(self, serializer):
if self.request.user.is_authenticated:
serializer.save(user=self.request.user)
# For Comments Voting
def partial_update(self, request, *args, **kwargs):
if request.method == 'PATCH':
if self.request.user.is_authenticated:
comment = get_object_or_404(Comment, pk=kwargs['pk'])
posttype = self.request.data['type']
try:
if posttype == 'down':
if comment.votes.exists(request.user.id, 1):
comment.votes.delete(request.user.id)
else:
comment.votes.down(request.user.id)
elif posttype == 'up':
if comment.votes.exists(request.user.id, 0):
comment.votes.delete(request.user.id)
else:
comment.votes.up(request.user.id)
# Should return the latest, values in the database
# Unfortunately Only old value keep coming back...
return Response(CommentUpdateSerializer(comment).data)
except:
raise serializers.ValidationError({'detail': _('Something isn\'t right! Try again later')})
И мой сериализатор:
class UserPublicSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'username',
'first_name',
'last_name',
'is_superuser',
'is_staff'
]
class CommentSerializer(serializers.ModelSerializer):
user = UserPublicSerializer(read_only=True)
image = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Comment
fields = ('id', 'url', 'user', 'content', 'timestamp', 'updated_at', 'image', 'num_vote_down', 'num_vote_up')
def get_image(self, obj):
img_ = static("img/avatar.png")
if obj.user.photo_url:
img_ = obj.user.photo_url
return img_
class CommentUpdateSerializer(serializers.ModelSerializer):
user = UserPublicSerializer(read_only=True)
image = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Comment
fields = ('id', 'url', 'user', 'content', 'timestamp', 'updated_at', 'image', 'num_vote_down', 'num_vote_up')
read_only_fields = ('url', 'user')
Обновлено : Модель:
class Comment(VoteModel, models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, null=True, blank=True, on_delete=models.SET_NULL)
url = models.URLField()
content = models.TextField()
num_vote = models.IntegerField(default=0)
#image = models.ImageField()
allow_annon = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.url
class Meta:
ordering = ['-created_at']
@property
def owner(self):
return self.user
Что мне нужно изменить, чтобы получить последние значения после записи голосования?