Django REST 框架。更新得到空的 validated_data

Ale*_*kin 6 django django-rest-framework

我制作了下面的序列化器。当我使用 POST 创建实例或使用 GET 获取实例时,就可以了。但是当我使用 PATCH 方法更新实例时,更新方法会获取一个空字典作为 valid_data。这是什么原因呢?如果我使用了根本错误的方法,请告诉我正确的方法。谢谢!

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
Run Code Online (Sandbox Code Playgroud)

我使用 ModelViewSet 作为视图:

class UserViewSet(viewsets.ModelViewSet):
    queryset = get_user_model().objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

网址.py:

router = routers.DefaultRouter()
router.register(r'accounts', UserViewSet, base_name='User')

urlpatterns = [
    url(r'', include(router.urls)),
]
Run Code Online (Sandbox Code Playgroud)

为了进行测试,我使用 Pycharm REST 客户端并发送“first_name=Name”作为 PATCH /accounts/1/ 的请求参数。上面的序列化器上的打印显示“{}”。所需帐户存在,并且序列化器接收目标实例。

Vla*_*ruz 2

好的,我找到了适合您的情况的解决方案。实际上我以前没有使用过这个工具,尽管我已经使用了PyCharm一年多了。这是一个很棒的工具,但关于细节的文档不多。解决方案:

  • JSON首先,我们需要在请求上以( )的形式发送请求Content-Type: application/json,请看这里,那里很好地解释了如何做到这一点。
  • 其次,在第三列上Request Body选择选项Text并使用此结构设置数据{"first_name": "Name"}(这对我来说是更难的部分)。

有关更多详细信息,请查看我在下面附上的屏幕截图:

在此输入图像描述