如何验证 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
我正在尝试向 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