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'>
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)
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
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
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
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
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'