Django REST框架中ListSerializer的update方法instance参数是什么?
关于Django REST框架ListSerializer.update()中instance参数的说明
嘿,我来给你掰扯清楚这个问题:在DRF的ListSerializer里,.update()方法的instance参数,其实就是你要批量处理的那些已存在的模型实例的集合——一般是个QuerySet,或者是能遍历的模型对象列表。
简单说,这些实例都是数据库里已经有的数据,接下来你要根据传入的validated_data,对它们做更新、甚至是删除操作。
拿你给的代码举例子:
class BookListSerializer(serializers.ListSerializer): def update(self, instance, validated_data): # 创建id到实例和id到数据项的映射 book_mapping = {book.id: book for book in instance} data_mapping = {item['id']: item for item in validated_data} # 执行创建和更新操作 ret = [] for book_id, data in data_mapping.items(): book = book_mapping.get(book_id, None) if book is None: ret.append(self.child.create(data)) else: ret.append(self.child.update(book, data)) # 执行删除操作 for book_id, book in book_mapping.items(): if book_id not in data_mapping: book.delete() return ret
这里的instance就是所有要处理的Book模型实例的集合:
- 代码第一步把
instance里的每本Book用id做了个映射表(book_mapping),这样后面拿到前端传的更新数据时,能快速通过id找到对应的书来更新。 - 接着遍历前端传的
validated_data(也就是批量更新的内容),如果某个id在book_mapping里找不到,就新建一本书;能找到的话就用子序列化器更新对应的实例。 - 最后还会检查原来的
instance里的书,如果某个书的id不在前端传的更新数据里,就把它删掉——这就实现了批量删除的逻辑。
另外要注意哦,对应的子序列化器(比如你的BookSerializer)里,得把id设成可写字段,不然前端传的id会被当成只读字段忽略掉,就没法匹配instance里的实例啦。
内容的提问来源于stack exchange,提问作者shahzaib
相关产品推荐
相关产品推荐

