首页 > 解决方案 > 序列化程序中嵌套字段的自定义验证器

问题描述

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

class PageSerializer(serializers.ModelSerializer):
    ...

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

并且页面字段验证器需要一个字典作为值。但我想要的是它也应该接受一个整数(页面的 id)。因此,在BookSerializer中,我尝试覆盖页面字段的validate函数,但它不起作用:

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函数从未被调用,因为它是一个嵌套字段。

谢谢 !

标签: pythondjangovalidationdjango-rest-frameworkserialization

解决方案


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

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

但它不会工作。

您需要在 Page 序列化程序上覆盖 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()

推荐阅读