【问题标题】:How to validate read only field in Django Rest Framework如何验证 Django Rest Framework 中的只读字段
【发布时间】:2018-05-17 01:33:33
【问题描述】:

我正在尝试向 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',)

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

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)

【问题讨论】:

    标签: django validation django-rest-framework readonly


    【解决方案1】:

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

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

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

    这样您就可以删除 perform_create 并使用它来代替

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 2021-03-06
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多