web-dev-qa-db-fra.com

Mettre à jour / ajouter serializer.data dans Django Rest Framework

Comment puis-je mettre à jour/ajouter serializer.data Dans Django Rest Framework?

data = serializer.data.update ({"item": "test"}) ne fonctionne pas

return Response(serializer.data, status=status.HTTP_201_CREATED)

serializer.data Est <class 'rest_framework.utils.serializer_helpers.ReturnDict'>

14
user4812479812

Malheureusement, serializer.data est une propriété de la classe et donc immuable . Au lieu d'ajouter des éléments à serializer.data vous pouvez copier serializer.data vers un autre dict. Vous pouvez essayer ceci:

newdict={'item':"test"}
newdict.update(serializer.data)
return Response(newdict, status=status.HTTP_201_CREATED)

En savoir plus sur property

26
Mohammed Shareef C

Non.

Si vous devez transmettre des données supplémentaires à la création/mise à jour du sérialiseur, veuillez le faire en appelant serializer.save () comme expliqué dans la documentation

5
Linovia

Vous pouvez également utiliser SerializerMethodField pour ajouter des données supplémentaires en ajoutant une méthode personnalisée au sérialiseur.

http://www.Django-rest-framework.org/api-guide/fields/#serializermethodfield

Vous pouvez utiliser une telle méthode pour renvoyer toutes les données, que ce soit dans le contexte du modèle ou non.

class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()

    class Meta:
        model = User

    def get_days_since_joined(self, obj):
        return (now() - obj.date_joined).days
3
lgespee

Nous pouvons mettre à jour les données transmises en réponse avec serializer._data

exemple de code

class SampleAPIView(generics.CreateAPIView)
    serializer_class = SampleSerializer

    def perform_update(self, serializer):
        application = serializer.save(status='pending')
        my_response_data = {'id': 110, 'name': 'Batta'}
        serializer._data = out_data

serializer._data fera la magie. Référence: https://github.com/encode/Django-rest-framework/blob/master/rest_framework/serializers.py#L26

3
Anjaneyulu Batta

Le serializer.data objet est une instance de ReturnList qui est immuable. Pour contourner cette limitation, vous pouvez transformer le serializer.data objet dans un simple Python list (), puis ajoutez la valeur souhaitée pour pouvoir utiliser votre liste transformée dans la méthode Response () comme ceci:

def get(self, request):
    serializer = YourAmazingSerializer(many=True)
    new_serializer_data = list(serializer.data)
    new_serializer_data.append({'dict_key': 'dict_value'})
    return Response(new_serializer_data)

Ensuite, votre réponse aura votre nouvel obj

2
Andre Machado

Outre ce que @ Linovia a suggéré, vous pouvez également faire quelque chose comme ceci:

serializer.data['item'] = 'test'

Assurez-vous d'appeler cela avant le serializer.is_valid est appelé.

Si vous souhaitez ajouter des données après la validation de serializer, vous devez procéder comme suit:

serializer.validated_data['item'] = 'test'
0
Rohit Arya