什么是 Django 中使用的 Serializers to_internal_value 方法

Spi*_*der 6 django rest

我有一些带有外键的模型和带有相关字段的序列化器。但是我有一个错误说 to_internal_value 需要先实现。但是,我不知道这种方法的用途,也无法在网上找到任何有用的参考。任何解释这一点的帮助都非常感谢。

小智 11

为了更新序列化程序的外部字段,我们使用serializer.relatedField它有两个函数:to_representation和to_internal_value。to_representation用于修改 API 的 GET 主体并to_internal_value用于验证序列化程序的更新请求,例如,它将帮助您检查更新相关字段的请求是否存在于其他表中以及诸如此类的事情。

假设我们有 2 个模型。一个是Foo,另一个是Bar,并且Foo是外键到Bar,所以我们需要编写以下序列化程序来验证和更新外键。

这是代码片段:-

class FooField(serializers.RelatedField):

    def to_representation(self, obj):
        return {
            'id': obj.id,
            'name': obj.name,
        }

    def to_internal_value(self, data):
        try:
            try:
                obj_id = data['id']
                return Obj.objects.get(id=obj_id)
            except KeyError:
                raise serializers.ValidationError(
                    'id is a required field.'
                )
            except ValueError:
                raise serializers.ValidationError(
                    'id must be an integer.'
                )
        except Obj.DoesNotExist:
            raise serializers.ValidationError(
            'Obj does not exist.'
            )

class BarSerializer(ModelSerializer):
    foo = FooField(
        queryset=Foo.objects.all()
    )
    class Meta:
        model = Bar
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你。

  • 我想说验证应该在“validate_<field_name>”方法中执行,而不是直接在“to_internal_value()”中执行。顶层验证也应该在“validate()”方法中执行。它们都是由“to_internal_value()”的默认实现调用的,因此重写此方法的正确用例是将数据转变为自定义表示形式。 (6认同)