【问题标题】:Django Rest Framework update fieldDjango Rest Framework 更新字段
【发布时间】:2015-09-19 07:39:20
【问题描述】:

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    您在序列化程序下的更新方法需要移动到您的视图中,这样您就会有类似的内容:

    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,您可能需要稍微更改上面的代码以使其正确。

    【讨论】:

    • 嗨,更新方法在这一行中断:instance = self.get_object()
    • 这是我收到的错误:Expected view UpdateName to be called with a URL keyword argument named "pk". Fix your URL conf, or set the .lookup_field attribute on the view correctly
    • @bla0009 你是如何解决这个问题的? url 关键字参数 pk?
    • @momokjaaaaa 更新某些属性的最佳方法实际上是使用查询集,因此您可以编写例如Person.objects.filter(....).update(name="some name")
    • 覆盖视图内部的更新方法和内部序列化程序有什么不同。 ?
    【解决方案2】:

    如果你使用class UpdateName(generics.CreateAPIView),这只会调用序列化器上的create() 方法。

    您应该改为将generics.UpdateAPIView 子类化。就是这样。 您不必将您的方法以suggested in this answer 的形式移动到视图中(它基本上是在复制/复制 UpdateModelMixin 的更新方法)

    有关序列化程序如何保存/更新see the docs here: 的更多信息

    【讨论】:

      【解决方案3】:

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

      serializer.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
      

      views.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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 2013-01-15
        • 2014-04-03
        • 2017-03-05
        • 2017-08-29
        • 1970-01-01
        相关资源
        最近更新 更多