2016-07-05 4 views
0

Django Rest Frameworkは、一括更新を実装する方法の例を示します。 この例は、更新メソッドがインスタンスの更新、作成、および破棄を処理することを示しています。 私が理解していないことは、オブジェクトがデータベースに保存されるとid/pkが作成されると思ったので、新しいデータがどのように 'id'を持つことができるかということです。私の理解では、IDがないので、新しいインスタンスがvalidated_dataにあるときに2行目が失敗するはずです。1回のリクエストで一括更新/作成

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ではなくデータベースで処理されます。 2つの辞書を持つ方が簡単ではないでしょうか。 1つはnew_data_mapping、もう1つは既存のものです。これはid属性を調べることで実装でき、存在しなければnew_data_mappingに追加されます。 提案している種類のアルゴリズムを実装する方法に関する情報へのリンクがありますか? – Helgi

+0

"IDの作成はデータベースによって処理され、Djangoでは実行されません" Linovia

関連する問題