J'ai créé le sérialiseur ci-dessous. Lorsque j'utilise POST pour créer ou GET pour obtenir une instance, tout va bien. Mais lorsque j'utilise la méthode PATCH pour mettre à jour une instance, la méthode de mise à jour obtient un dict vide comme validated_data. Quelle en est la raison ? Si j'utilise une approche fondamentalement erronée, veuillez m'indiquer la bonne méthode. Merci de votre compréhension.
class UserSerializer(serializers.ModelSerializer):
# password = serializers.CharField(write_only=True)
class Meta:
model = get_user_model()
fields = ('id', 'email', 'first_name', 'last_name', 'password', )
read_only_fields = ('is_staff', 'is_superuser', 'is_active', )
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop('password')
user = self.Meta.model(**validated_data)
user.set_password(password)
user.is_active = True
user.save()
return user
def update(self, instance, validated_data):
print validated_data # returns {} - empty dict
return instance
J'utilise ModelViewSet comme vue :
class UserViewSet(viewsets.ModelViewSet):
queryset = get_user_model().objects.all()
serializer_class = UserSerializer
urls.py :
router = routers.DefaultRouter()
router.register(r'accounts', UserViewSet, base_name='User')
urlpatterns = [
url(r'', include(router.urls)),
]
Pour les tests, j'utilise le client REST de Pycharm et j'envoie "first_name=Name" comme paramètre de requête pour PATCH /accounts/1/. L'impression du sérialiseur ci-dessus me montre "{}". Le compte nécessaire existe et le sérialiseur reçoit l'instance cible.