为什么django-rest-frameworks request.data有时是不可变的?

Dav*_*han 1 python django django-rest-framework

在我的宁静中,CreateAPIView我会改变我的request.data字典.

偶尔我收到一个未被我的测试捕获的错误:

This QueryDict instance is immutable
Run Code Online (Sandbox Code Playgroud)

例如:

class CreateView(CreateAPIView):
    serializer_class = ...
    queryset = ...

    def post(self, request, *args, **kwargs):
        request.data['user'] = request.user.pk
        return self.create(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

request.datadict在我的测试中似乎是正常的.为什么有时候QueryDict呢?应如何处理?request.data一般不应该变异吗?ModelSerializer当您需要自己填充某些字段时,应该如何使用该类?

JPG*_*JPG 5

为什么这种偶然的行为?

当我们查看请求SC(如@Kenny Ackerman所提到的)时,QueryDict如果您将表单媒体类型('application/x-www-form-urlencoded''multipart/form-data')数据传递给视图类,它将返回一个对象.
此检查在类的is_form_media_type()方法中执行Request.

如果要将application/json数据传递给视图,那么request.data它将是一个dict对象.

如何重现这种行为?

可以通过将不同的ContentType数据发送到视图中来重现它.(在POSTMAN工具中,使用form-dataraw JSON获取行为)


如何在序列化程序中获取当前登录用户

方法-1通过.save() 覆盖perform_create()方法将额外参数传递给(如提到的@Linovia)

class CreateView(CreateAPIView):
    serializer_class = ...
    queryset = ...

    def post(self, request, *args, **kwargs):
        request.data['user'] = request.user.pk
        return self.create(request, *args, **kwargs)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)

方法-2使用CurrentUserDefault()如下所示的类

from django.contrib.auth import get_user_model

User = get_user_model()


class MySerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), default=serializers.CurrentUserDefault())

    class Meta:
    # your code
Run Code Online (Sandbox Code Playgroud)