Django Rest framework自定义嵌套模型序列化时,在validated_data中不能获取id字段的问题

新手踩坑问题,先看样例代码

class BookSerializer(ModelSerializer):

    authors = AuthorSerializer(read_only=False, many=True)

    class Meta:
        model = Book
        fields = "__all__"

    def update(self, instance, validated_data):
    	pass

需求是这样的,为了实现在Book的PUT/PATCH接口中能嵌套地更新Author,需要在BookSerializer中的update方法里面拿到validated_data中author数据的id。
但是正常情况下validated_data中是没有模型id的(即使前端发送过来的数据包含了id),因为一般情况下id都是仅可读的。于是尝试在Author模型定义时,去掉id字段editable=False,即由

class Author(models.Model)
	id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, verbose_name="ID", help_text="ID")

变为

class Author(models.Model)
	id = models.UUIDField(primary_key=True, default=uuid.uuid4, verbose_name="ID", help_text="ID")

结果是,程序还未进入到update方法时就已经报错,提示Author ID已经存在。

方案1
参考这里,保留Author模型中id的editable=False,仅在AuthorSerializer的Meta类里面声明id的read_only为False即可。

class AuthorSerializer(ModelSerializer):
    class Meta:
        model = Author
        fields = "__all__"
        extra_kwargs = {'id': {'read_only': False, 'required': False}}

需要注意的是,这里还需要加上’required’: False,否则在创建Author的时候会提示”id is required",强制要求带上id字段。

方案2
参考这里这里,使用serializers.ModelField,在AuthorSerializer新建一个id字段指向Author模型中的id字段

class AuthorSerializer(ModelSerializer):
	id = serializers.ModelField(Author()._meta.get_field('id'), required=False)
    class Meta:
        model = Author
        fields = "__all__"

同理,需要设置required=False。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值