要更新序列化程序的外部字段,我们使用serializer.relatedField,它有两个函数to_representation和to_internal_value 。 to_representation用于修改API的GET主体, to_internal_value用于验证序列化程序的更新请求,例如,它将帮助您检查更新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