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

时间:2018-04-25 17:07:07

标签: python django validation django-rest-framework serializer

在我的 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 函数,因为它是一个嵌套字段。

谢谢!

1 个答案:

答案 0 :(得分:0)

Correct way to create custom validation is:

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

But it won't be working.

You need override to_internal function on Page serializer:

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

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