Python DRF&x27;s CurrentUserDefault为';t返回用户
我有一个Python DRF&x27;s CurrentUserDefault为';t返回用户,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个ModelSerializer。在保存模型时,我试图设置一个用户外键,该模型是通过ModelViewSet类的create()和update()方法实例化的。例如: 模型视图集: def create(self, request): serializer = self.get_serializer(data=request.data, many=isinstance(request.data, list)) if not serializer.is_valid():
ModelSerializer
。在保存模型时,我试图设置一个用户外键,该模型是通过ModelViewSet
类的create()
和update()
方法实例化的。例如:
模型视图集:
def create(self, request):
serializer = self.get_serializer(data=request.data, many=isinstance(request.data, list))
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
序列化程序
def process_foreign_keys(self, validated_data):
""" Simplified for SO example """
profile = get_object_or_404(Profile, fk_user=CurrentUserDefault())
validated_data['profile'] = profile
return validated_data
def create(self, validated_data):
""" Create a Product instance. Routed from POST via DRF's serializer """
validated_data = self.process_foreign_keys(validated_data)
return Product.objects.create(**validated_data)
该代码不起作用-它在get\u object\u或\u 404
行上引发异常:
int()参数必须是字符串、类似字节的对象或数字,而不是“CurrentUserDefault”
如果我在ModelSerializer.create()
方法中放入一些调试语句,就会得到一些奇怪的东西:
currentuser = CurrentUserDefault()
# Expect <class django.contrib.auth.models.User>, get <class 'rest_framework.fields.CurrentUserDefault'>
print("currentuser type " + str(type(currentuser)))
# Causes AttributeError: 'CurrentUserDefault' object has no attribute 'user'
print("currentuser is " + str(currentuser.__call__()))
# Causes AttributeError: 'ProductSerializer' object has no attribute 'request'
print("currentuser is " + str(self.request.user))
。。。然后尝试
validated\u数据。在update
方法中获取('currentuser')
,并返回None
CurrentUserDefault
并不是让用户走出真空的神奇方法。它必须位于中显示的字段a的上下文中
正如@pramod指出的,您需要:
get_object_or_404(Profile, fk_user=self.request.user)
或者将CurrentUserDefault
设置为字段的默认值
def create(self, request):
serializer = self.get_serializer(data=request.data, many=isinstance(request.data, list), context={"request": request})
您能否将您的序列化程序实例化更改为上述代码,并按如下方式使用它:
profile = get_object_or_404(Profile, fk_user=self.request.user)
您可以发布配置文件模型吗?您可以尝试get\u object\u或\u 404(profile,fk\u user=self.request.user)
通过尝试在序列化程序中访问该对象来获取“ProductSerializer”对象没有属性“request”
。我认为get\u serializer
在实例化时不会传递请求上下文,我只能在ModelViewSet
中对用户外键进行此处理,并根据您的答案再次更新。使用HiddenField
时,用户仍然显示为None
。get\u序列化程序调用中的上下文不应是必需的,因为它已在DRF的get\u序列化程序中创建。但是,您需要将self.request更改为self.context['request'],但没有意识到它在序列化程序中。是的,完全同意context={“request”:request}
这样,我做的事情与将self.request更改为self.context['c']相同get_serializer
将访问self.context['request']
object谢谢,这真的很有帮助!
profile = get_object_or_404(Profile, fk_user=self.request.user)