wake-up-neo.com

Django Rest Framework-Aktualisierungsfeld

Ich bin neu in DRF und ich versuche, eine benutzerdefinierte Ansicht/Serialisierung zu schreiben, mit der ich nur ein Feld eines Benutzerobjekts aktualisieren kann.

Ich muss Logik machen, nur um den "Namen" des Benutzers zu aktualisieren.

Ich schrieb Serializer:

class ClientNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClientUser
        fields = ('name',)

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.save()
        return instance

Diese Methode wird nie aufgerufen. Ich habe versucht, dort einen Haltepunkt zu setzen und ihn zu debuggen, aber er wird nie aufgerufen, auch wenn ich PUT-, POST oder PATCH-Methoden verwende. Wenn ich create hinzufüge, wird er ausgeführt wird aufgerufen, wenn ich POST verwende.

So sieht meine Ansicht aus:

class UpdateName(generics.CreateAPIView):
    queryset = ClientUser.objects.all()
    serializer_class = ClientNameSerializer
    permission_classes = (permissions.IsAuthenticated,)

Hat jemand einen Vorschlag? Vielen Dank!

Mein models.py sieht so aus

class ClientUser(models.Model):
    owner = models.OneToOneField(User,unique=True,primary_key=True)

    phone_number = models.CharField(validators=[PHONE_REGEX],max_length=20,unique=True)

    name = models.CharField(max_length=100,blank=True)
    status = models.IntegerField(default=1)
    member_from = models.DateTimeField('member from',auto_now_add=True)
    is_member = models.BooleanField(default=False)
29
Boban

Die Definition, welche Methoden der Endpunkt akzeptieren kann, erfolgt in der Ansicht und nicht im Serializer.

Die Aktualisierungsmethode, die Sie unter Ihrem Serializer haben, muss in Ihre Ansicht verschoben werden, damit Sie Folgendes haben:

serializers.py

class ClientNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClientUser

views.py

class UpdateName(generics.UpdateAPIView):
    queryset = ClientUser.objects.all()
    serializer_class = ClientNameSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def update(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.name = request.data.get("name")
        instance.save()

        serializer = self.get_serializer(instance)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        return Response(serializer.data)

Beachten Sie, dass Sie pdateModelMixin überschreiben und möglicherweise den obigen Code ein wenig ändern müssen, um es richtig zu machen.

26
awwester

Wenn Sie class UpdateName(generics.CreateAPIView) verwenden, wird nur eine create() -Methode für den Serializer aufgerufen.

Sie sollten die Unterklasse generics.UpdateAPIView stattdessen. Und das ist es. Sie müssen Ihre Methode nicht in die Ansicht verschieben, da in dieser Antwort vorgeschlagen (im Grunde wird die UpdateModelMixin-Aktualisierungsmethode kopiert/dupliziert)

Weitere Informationen zur Funktionsweise von Serializern beim Speichern/Aktualisieren siehe die Dokumentation hier:

1
Tadej Krevh