2017-10-18 14 views
0

我使用list serializer by many = True。创建方法运行完美,但我无法理解django rest框架的文档中的列表序列化器的自定义更新方法的流程。使用列表序列化的基础很明显,但是当我在代码中使用它时,流程是不可理解的。我无法理解第四行中的book.items是什么意思。什么是书?在文档中,它还要求为实例序列化程序添加一个明确的id字段。默认的隐式生成的id字段被标记为read_only。希望了解文档的内容以及如何实施。文档的上下文给出如下。无法理解django rest框架中列表序列化程序更新的流程

class BookListSerializer(serializers.ListSerializer): 
def update(self, instance, validated_data): 
    # Maps for id->instance and id->data item. 
    book_mapping = {book.id: book for book in instance} 
    data_mapping = {item['id']: item for item in validated_data} 

    # Perform creations and updates. 
    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)) 

    # Perform deletions. 
    for book_id, book in book_mapping.items(): 
     if book_id not in data_mapping:a 
      book.delete() 

    return ret 

回答

0

instance是一个书单,即是应被序列化的类的对象。 validated_data是数据字典列表,其中每个item与您通过的validated_data类似,如果您使用的不是列表序列化程序。要使用图书对象的ID,您使用book.id,要访问validated_data中的项目的ID,请使用item ['id']。 你需要一个非read_only id字段的原因是,如果你想放置一个对象列表并替换一个完整的集合,你需要通过id来定义,如果一个项目应该更新一个现有的项目,如果是的话,哪一个,或者一个项目是否是新的。这就是循环中发生的事情:第一种情况是,项目可以创建或更新,具体取决于具有相同ID的其他对象是否存在。在最后一个循环中,所有未出现在validated_data中的项目都将被删除。

相关问题