2 votes

Cadre REST de Django. Update obtient un validated_data vide

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.

1voto

Vladir Parrado Cruz Points 1683

Ok, j'ai trouvé une solution pour votre cas. En fait, je n'avais jamais utilisé cet outil auparavant, bien que j'aie utilisé PyCharm depuis plus d'un an. C'est un outil formidable, mais il n'y a pas beaucoup de documentation sur les détails. Solution :

  • Tout d'abord, nous devons envoyer la demande en tant que JSON ( Content-Type: application/json ) sur la demande, jetez un coup d'œil aquí La procédure est bien expliquée.
  • Deuxièmement, dans la troisième colonne Request Body sélectionner l'option Text et définir les données avec cette structure {"first_name": "Name"} (c'était la partie la plus difficile pour moi).

Pour plus de détails, consultez la capture d'écran que je joins ci-dessous :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X