Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DRF&x27;s CurrentUserDefault为';t返回用户_Python_Django_Django Rest Framework - Fatal编程技术网

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)