为什么这个偶然行为?
当我们审视请求的 SC https://github.com/encode/django-rest-framework/blob/f744da74d2878b480220ebaf9d8117ff9b79a947/rest_framework/request.py#L333(正如@Kenny Ackerman提到的),它返回一个QueryDict
对象,如果你正在传递一个表单媒体类型 ('application/x-www-form-urlencoded'
or 'multipart/form-data'
) 数据到视图类。
该检查正在执行is_form_media_type() https://github.com/encode/django-rest-framework/blob/f744da74d2878b480220ebaf9d8117ff9b79a947/rest_framework/request.py#L25的方法Request
class.
如果您正在通过application/json
数据到视图,request.data
将是一个dict
目的。
如何重现行为?
它可以通过使用发送不同的ContentType
数据进入视图。 (在POSTMAN工具中,使用form-data
and raw JSON
获得行为)
如何获得当前登录用户在序列化器中?
Method-1将额外的参数传递给.save()
(正如@Linovia提到的)通过覆盖perform_create()
method
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)
Method-2 Use CurrentUserDefault() http://www.django-rest-framework.org/api-guide/validators/#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