Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中使用的内部值序列化方法是什么_Django_Rest - Fatal编程技术网

Django中使用的内部值序列化方法是什么

Django中使用的内部值序列化方法是什么,django,rest,Django,Rest,我有一些带有foreignKey的模型和带有relatedField的序列化程序。但我有一个错误,即to_internal_值需要首先实现。然而,我不知道这种方法的用途,在网上也找不到任何有用的参考资料。任何解释这一点的帮助都将不胜感激 要更新序列化程序的外部字段,我们使用serializer.relatedField,它有两个功能:到\u表示和到\u内部值to_表示法用于修改API的GET body,而to_internal_值用于验证序列化程序的更新请求,例如,它将帮助您检查另一个表中是否存

我有一些带有foreignKey的模型和带有relatedField的序列化程序。但我有一个错误,即to_internal_值需要首先实现。然而,我不知道这种方法的用途,在网上也找不到任何有用的参考资料。任何解释这一点的帮助都将不胜感激

要更新序列化程序的外部字段,我们使用
serializer.relatedField
,它有两个功能:
到\u表示
到\u内部值
to_表示法
用于修改API的GET body,而
to_internal_值
用于验证序列化程序的更新请求,例如,它将帮助您检查另一个表中是否存在更新relatedField的请求等

假设我们有两个模型。一个是
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

希望这能对您有所帮助。

请将模型代码添加到问题中。我想说的是,验证应该在
validate\u
方法中执行,而不是直接进入
to\u internal\u value()
。顶级验证也应该在
validate()
方法中执行。它们都是由
的默认实现调用为_internal_value()
,因此覆盖此方法的正确用例是将数据变异为自定义表示。@VladRusu您可以更详细地解释一下吗。我没有完全明白你想说什么?