繁体   English   中英

如何访问我想从序列化程序内部验证的实例属性?

[英]How to access atribute of instance I want to validate from inside serializer?

在我看来,我执行以下操作:

class ReviewViewSet(viewsets.ModelViewSet):

    #queryset, serializer_class and permission_classes defined here

    def perform_create(self, serializer):
        title_id = self.kwargs.get('title_id')
        title = get_object_or_404(Title, pk=title_id)
        serializer.save(author=self.request.user, title=title)

我想验证该评论尚不存在。 我正在尝试在序列化程序的validate()执行此操作:

class ReviewSerializer(serializers.ModelSerializer):
    title = serializers.SlugRelatedField(slug_field='pk', read_only='True')
    author = serializers.SlugRelatedField(slug_field='username', read_only='True')

    def validate(self, data):
        title = # <-- How to get title here?
        author = self.context['request'].user
        queryset = Review.objects.all().filter(title=title, author=author)
        if queryset.exists():
            raise serializers.ValidationError('Review alredy exists')
        return(data)

    class Meta:
        fields = '__all__'
        model = Review

尝试执行title = self.title引发AttributeError: 'ReviewSerializer' object has no attribute 'title'

在我的情况下,如何从validate()内部访问title

这是我的Review模型:

class Review(models.Model):
    class Meta:
        ordering = ['-pub_date']
        unique_together = ['title', 'author']

    title = models.ForeignKey(
        Title,
        on_delete=models.CASCADE,
        related_name='reviews',
    )
    author = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
        related_name='reviews',
    )
    text = models.TextField('Review text')
    score = models.PositiveSmallIntegerField(
        'Review score',
        validators=[
            MinValueValidator(1),
            MaxValueValidator(10)
        ]
    )
    pub_date = models.DateTimeField(
        'Date and time of review',
        auto_now_add=True,
        db_index=True
    )

您的问题的答案在于文档: https : //www.django-rest-framework.org/api-guide/serializers/#object-level-validation

关于validate方法:

此方法采用单个参数,即字段值的字典

如果您查看文档中的代码示例,您将看到您可能需要验证的所有数据都在validate方法的data参数中。

因此,标题在data['title']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM