如何验证 Django Rest Framework 中的只读字段

How to validate read only field in Django Rest Framework

我正在尝试向 Django Rest Framework tutorial 中的代码添加投票功能。在 Snippet 模型之上,我添加了一个 Vote 模型:

class Vote(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    voter = models.ForeignKey(User, on_delete=models.CASCADE)
    snippet = models.ForeignKey(Snippet, related_name='votes', on_delete=models.CASCADE)

    class Meta:
        ordering = ('created',)

在我的序列化程序中,我试图验证用户不能多次投票并且不能为他自己的片段投票的事实:

class VoteSerializer(serializers.HyperlinkedModelSerializer):
    voter = serializers.ReadOnlyField(source='voter.username',validators=[UniqueValidator(queryset=Vote.objects.all(), message=already_voted)])
    snippet = serializers.PrimaryKeyRelatedField(queryset=Snippet.objects.all())

    def validate(self, data):
        snippet = data.get('snippet')
        voter = data.get('voter')
        if voter==data['snippet'].owner:
            raise serializers.ValidationError(u"Voter cannot vote for himself.")
        return data

选民字段必须是只读的。问题是 ReadOnlyField 在数据结构中不可用。如何使用只读字段进行验证?

编辑:这是我的观点

class VoteViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.
    """

    queryset = Vote.objects.all()
    serializer_class = VoteSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                      IsOwnerOrReadOnly,)


    def perform_create(self, serializer):
        serializer.save(voter=self.request.user)

在您的序列化程序中,您已经可以使用 self.context['request'].user:

访问当前用户

所以你的代码应该是这样的:

if self.context['request'].user == data['snippet'].owner:
        raise serializers.ValidationError(u"Voter cannot vote for himself.")

所以你可以删除 perform_create 并使用这个 istead