2016-07-05 92 views
0

Django Rest Framework提供了一个关于如何实现批量更新的例子。该示例显示更新方法处理更新,创建和销毁实例。 我不明白的是,新数据如何具有'id',因为我认为一旦对象被保存到数据库就会创建一个id/pk。根据我的理解,当新实例处于validated_data中时,第二行应该失败,因为它们没有id。批量更新/创建一个请求

的例子

class BookListSerializer(serializers.ListSerializer): 
def update(self, instance, validated_data): 
    book_mapping = {book.id: book for book in instance} 
    data_mapping = {item['id']: item for item in validated_data} # --> shouldn't this fail if new items are 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: 
      book.delete() 

    return ret 

Link to the example in Django Rest Framework docs

回答

1

我认为,例如需要设置的id。您需要使用不同算法处理物料创建,而不需要使用id

+0

创建id由数据库处理,而不是由Django处理。 只需要两个字就不太容易了。一个用于new_data_mapping,另一个用于现有的。这可以通过检查id属性来实现,如果它不存在,则该项目被添加到new_data_mapping。 您是否有链接了解如何实现您建议的算法类型的信息? – Helgi

+0

“创建的id由数据库处理,而不是由Django处理” Linovia