验证序列化程序对象,而不需要验证字段

时间:2017-09-15 17:06:41

标签: django django-rest-framework

我有以下视图集,

class VoteViewSet(viewsets.ModelViewSet):
    serializer_class = VoteSerializer
    permission_classes = [IsAuthenticated]

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

    def get_queryset(self):
        return Vote.objects.filter(created_by=self.request.user)

串行

class VoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vote
        fields = ('id', 'request')
        read_only_fields = ('id',)

和模特。

class Vote(models.Model):
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='votes')
    request = models.ForeignKey(Request, related_name='votes')

    class Meta:
        unique_together = [('request', 'created_by')]

我正在尝试保存用户的投票,但当我对同一请求投票两次时,我得到IntegrityError: UNIQUE constraint failed。我可以通过将created_by添加到VoteSerializer来修复错误,但我不想在序列化数据中添加它。我有什么选择?

2 个答案:

答案 0 :(得分:1)

您可以尝试object-level-validation

class VoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vote
        fields = ('id', 'request')
        read_only_fields = ('id',)

    def validate(self, data):
        """
        Check Unique vote per user.
        """
        created_by = self.context['request'].user
        if self.instance is None:
            Vote(**data, created_by=created_by).full_clean()
        else:
            self.instance.created_by = created_by
            self.instance.full_clean()
        return data

答案 1 :(得分:1)

from rest_framework.validators import UniqueTogetherValidator

class ExampleSerializer(serializers.Serializer):
    # ...
    class Meta:
        # ToDo items belong to a parent list, and have an ordering defined
        # by the 'position' field. No two items in a given list may share
        # the same position.
        validators = [
            UniqueTogetherValidator(
                queryset=ToDoItem.objects.all(),
                fields=('list', 'position')
            )
        ]

UniqueTogetherValidator