簡體   English   中英

Django Rest Framework 更新字段

[英]Django Rest Framework update field

我是 DRF 的新手,我正在嘗試編寫自定義視圖/序列化程序,我可以用它來更新用戶對象的一個​​字段。

我需要制定邏輯來更新用戶的“名稱”。

我寫了序列化程序:

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

永遠不會調用此方法。 我嘗試在那里設置斷點並調試它,但它從未被調用,即使我使用 PUT、POST 或 PATCH 方法。 如果我添加create方法,它會在我使用 POST 時被調用。

這就是我的觀點:

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

有人有什么建議嗎? 謝謝!

我的models.py看起來像這樣

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)

端點可以接受哪些方法的定義在視圖中完成,而不是在序列化程序中完成。

您在序列化程序下的更新方法需要移動到您的視圖中,因此您將擁有如下內容:

序列化程序.py

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

視圖.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)

請注意,您正在覆蓋UpdateModelMixin ,您可能需要稍微更改上面的代碼以使其正確。

如果您使用class UpdateName(generics.CreateAPIView) ,這只會在序列化程序上調用create()方法。

您應該將generics.UpdateAPIView子類化。 就是這樣。 您不必按照此答案中的建議將您的方法移動到視圖(它基本上是復制/復制 UpdateModelMixin 的更新方法)

有關序列化程序如何在保存/更新方面工作的更多信息, 請參閱此處的文檔:

另一種方法可能是以下方法:

序列化程序.py

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

視圖.py

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

    def update(self, request, *args, **kwargs):
        data_to_change = {'name': request.data.get("name")}
        # Partial update of the data
        serializer = self.serializer_class(request.user, data=data_to_change, partial=True)
        if serializer.is_valid():
            self.perform_update(serializer)

        return Response(serializer.data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM