串行器中嵌套字段的自定义验证器

问题描述 投票:1回答:1

在我的BookSerializer中,我有一个嵌套的字段页面:

class PageSerializer(serializers.ModelSerializer):
    ...

class BookSerializer(serializers.ModelSerializer):
    page = PageSerializer()

并且页面字段验证器期望字典作为值。但我想要的是它也应该接受一个整数(页面的id)。所以在BookSerializer中,我试图覆盖页面字段的验证功能,但它不起作用:

class BookSerializer(serializers.ModelSerializer):
    page = PageSerializer()

    def validate_page(self, value):
        if isinstance(value, int):
            return value

        # if value is not an integer, reuse the default validator
        # but django said that validate_page is not a function
        return super().validate_page()

似乎从未调用validate_page函数,因为它是一个嵌套字段。

谢谢 !

python django validation django-rest-framework serializer
1个回答
0
投票

创建自定义验证的正确方法是:

def validate_page(self, value):
    if isinstance(value, int):
        return value
    return value

但它不会起作用。

您需要在Page serializer上覆盖to_internal函数:

class PageSerializer(serializers.ModelSerializer):
    def to_internal_value(self, data):
        return get_object_or_404(Page, pk=data)
    ...

class BookSerializer(serializers.ModelSerializer):
    page = PageSerializer()
© www.soinside.com 2019 - 2024. All rights reserved.