Как вернуть данные сериализатора до django остальные рамки - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь проголосовать за комментарии в моем сериализаторе. Кажется, что все работает хорошо с частью голосования.

Однако сериализатор возвращает старые значения, а не обновленные значения.

Я знаю, что делаю что-то не так, просто не знаю, как это сделать. сложите все вместе, чтобы вернуть недавнее значение через $ 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

Что мне нужно изменить, чтобы получить последние значения после записи голосования?

1 Ответ

0 голосов
/ 15 февраля 2020

вы можете использовать refresh_from_db () для обновления значений объекта. Так будет:

comment.refresh_from_db() 
return Response(CommentUpdateSerializer(comment).data)

На основании этого комментария

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...