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当您需要自己填充某些字段时,应该如何使用该类?
为什么这种偶然的行为?
当我们查看请求的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-data和raw 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 codeRun Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |