2017-10-18 4 views
0

J'utilise la liste Serializer par many = True. La méthode create fonctionne parfaitement mais je suis incapable de comprendre le flux de la méthode de mise à jour personnalisée du sérialiseur de liste dans la documentation du framework de repos django. L'utilisation de la base de liste sérialiseur est claire mais quand je l'utilise dans le code, le flux n'est pas compréhensible. Je ne suis pas capable de comprendre ce que book.items signifie dans la quatrième ligne. Quel est le livre? Dans la documentation, il est également demandé d'ajouter un champ id explicite au sérialiseur d'instance. Le champ d'ID implicite généré par défaut est marqué comme read_only. Vous cherchez à comprendre ce que dit la documentation et comment la mettre en œuvre. Le contexte de la documentation est donné ci-dessous.Impossible de comprendre le flux de la mise à jour du sérialiseur de liste dans le cadre de repos django

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 

Répondre

0

instance est une liste de livres, à savoir des objets de la classe qui doit être publié en feuilleton. validated_data est une liste de dictionnaires de données, où chaque item est similaire à ce que le validated_data vous êtes passé, si vous utilisez un sérialiseur de liste non. Pour accéder à l'ID d'un objet livre, vous utilisez book.id, pour accéder à l'ID des éléments dans validated_data, vous utilisez l'élément ['id']. Vous avez besoin d'un champ id non read_only pour la raison, que si vous voulez mettre une liste d'objets et remplacer une collection entière, vous devez passer des identifiants pour définir, si un élément doit mettre à jour un élément existant et si oui, lequel, ou si un article est nouveau. C'est ce qui se passe dans les boucles: dans le premier, les éléments sont créés ou mis à jour, selon que des objets ayant le même identifiant existent ou non. Dans la dernière boucle, tous les éléments qui n'apparaissent pas dans validated_data sont supprimés.