Django Rest框架更新字段 [英] Django Rest Framework update field

查看:273
本文介绍了Django Rest框架更新字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是DRF的新人,我正在尝试编写自定义视图/序列化程序,我可以使用它来更新用户对象的一个​​字段。

I am new to DRF and I am trying to write custom view / serializer that I can use to update just one field of user object.

我需要做逻辑只是更新用户的名称。

I need to make logic just to update the "name" of the user.

我写了serializer:

I wrote 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

此方法从不被调用。我尝试在那里设置断点并调试它,但它永远不会被调用,即使我使用PUT,POST或PATCH方法。如果我添加创建方法,则在使用POST时调用它。

This method is never called. I tried setting breakpoint there and debug it, but it is never called, even if I use PUT, POST or PATCH methods. If I add create method it is being called when I use POST.

这是我的视图如何:

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



<谢谢!

Does anyone have some suggestion? Thanks!

我的 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)


推荐答案

端点可以接受的方法的定义是在视图中完成的,而不是序列化程序。

The definition of what methods the endpoint can accept are done in the view, not in the serializer.

您的序列化程序下的更新方法需要移动到您的视图中,以便您可以使用以下内容:

The update method you have under your serializer needs to be moved into your view so you'll have something like:

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



<请注意,您将覆盖 UpdateModelMixin 和您可能需要更改上述代码才能正确。

Take note that you're overriding the UpdateModelMixin and you might need to change the above code a little bit to get it right.

这篇关于Django Rest框架更新字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆