2017-10-18 8 views
0

リストシリアライザをmany = Trueで使用しています。 createメソッドは完全に実行されていますが、私はdjango rest frameworkのドキュメントでlist serializerのカスタム更新メソッドの流れを理解することができません。リストシリアライザのベースを使用することは明らかですが、コードで使用しているときは、そのフローは理解できません。私は4行目で何が意味するのか理解できません。本は何ですか?ドキュメントでは、明示的な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

は、書籍のリスト、つまりシリアル化されるクラスのオブジェクトです。 validated_dataはデータ辞書のリストです。ここでは、リストなしシリアライザを使用すると、itemはあなたが渡したものと似ています。ブックオブジェクトのIDにアクセスするにはbook.idを使用し、validated_dataのアイテムのIDにアクセスするには、アイテム['id']を使用します。 あなたはオブジェクトのリストを入れてコレクション全体を置き換えたい場合、アイテムが既存のアイテムを更新するかどうかを定義するためにidを渡す必要があります。どちらか1つ、または項目が新規の場合。これはループ内で起こることです:最初のアイテムでは、同じIDを持つオブジェクトが存在するかどうかに応じて、アイテムが作成または更新されます。最後のループでは、validated_dataに表示されない項目はすべて削除されます。

関連する問題