Django ValueError位于/api/users/Cannot query";“参孙”:必须是;“用户”;实例
在注册时为新用户生成令牌时出现问题 在对POSTMAN进行测试期间,当我向服务器发送POST请求时,用户会得到注册,但不会为用户生成令牌Django ValueError位于/api/users/Cannot query";“参孙”:必须是;“用户”;实例,django,python-3.x,django-rest-framework,Django,Python 3.x,Django Rest Framework,在注册时为新用户生成令牌时出现问题 在对POSTMAN进行测试期间,当我向服务器发送POST请求时,用户会得到注册,但不会为用户生成令牌 Environment: Request Method: POST Request URL: http://localhost:8000/api/users/ Django Version: 3.0 Python Version: 3.8.0 Installed Applications: ['phone_verify', 'django.contri
Environment:
Request Method: POST
Request URL: http://localhost:8000/api/users/
Django Version: 3.0
Python Version: 3.8.0
Installed Applications:
['phone_verify',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_auth',
'rest_framework.authtoken',
'findr']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
raise exc
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\UBITEK\Desktop\FinderAPI\findr\views.py", line 133, in post
Token.objects.filter(user=users).delete()
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\query.py", line 904, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\query.py", line 923, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1337, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1362, in _add_q
child_clause, needed_inner = self.build_filter(
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1271, in build_filter
self.check_related_objects(join_info.final_field, value, join_info.opts)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1112, in check_related_objects
self.check_query_object_type(value, opts, field)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1093, in check_query_object_type
raise ValueError(
Exception Type: ValueError at /api/users/
Exception Value: Cannot query "sams": Must be "User" instance.
在对POSTMAN进行测试期间,当我向服务器发送POST请求时,用户会得到注册,但不会为用户生成令牌
Environment:
Request Method: POST
Request URL: http://localhost:8000/api/users/
Django Version: 3.0
Python Version: 3.8.0
Installed Applications:
['phone_verify',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_auth',
'rest_framework.authtoken',
'findr']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
raise exc
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\UBITEK\Desktop\FinderAPI\findr\views.py", line 133, in post
Token.objects.filter(user=users).delete()
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\query.py", line 904, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\query.py", line 923, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1337, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1362, in _add_q
child_clause, needed_inner = self.build_filter(
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1271, in build_filter
self.check_related_objects(join_info.final_field, value, join_info.opts)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1112, in check_related_objects
self.check_query_object_type(value, opts, field)
File "C:\Users\UBITEK\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py", line 1093, in check_query_object_type
raise ValueError(
Exception Type: ValueError at /api/users/
Exception Value: Cannot query "sams": Must be "User" instance.
views.py
类用户列表(APIView):
def get(自我,请求):
users=User.objects.all()
serializer=UserSerializer(users,many=True)
返回响应(serializer.data)
def post(自我,请求):
serializer=UserSerializer(data=request.data)
如果序列化程序.u有效():
users=serializer.save()
如果用户:
Token.objects.filter(用户=用户).delete()
token=token.objects.create(用户=users)
json=serializer.data
json['token']=token.key
返回响应(json,status=status.HTTP\u 201\u已创建)
返回响应(serializer.errors,status=status.HTTP\u 400\u BAD\u请求)
序列化程序.py
class UserSerializer(serializers.ModelSerializer):
username=serializers.CharField(
validators=[UniqueValidator(queryset=User.objects.all())]
)
phone_number=serializers.CharField(最小长度=11,必需=True,
validators=[UniqueValidator(queryset=User.objects.all())]
def创建(自我验证的_数据):
user=user.objects.create(username=validated_data['username'],phone_number=validated_data['phone_number']))
返回用户
类元:
模型=用户
字段=('id','username','phone_number')
问题的解决方案:向create方法提供request.user
Token.objects.create(user=request.user)
从注释中,您将在/api/users/(1062,“密钥“user\u id”的重复条目“1”)处获得IntegrityError
。由于Token
模型具有OneToOneField
和'User'模型,因此同一用户不能有重复条目。您已删除令牌,然后再次创建它。由于要为刚创建的用户创建令牌,因此post方法如下:
def post(自我,请求):
serializer=UserSerializer(data=request.data)
如果序列化程序.u有效():
users=serializer.save()
如果用户:
Token.objects.filter(用户=用户).delete()
token=token.objects.create(用户=users)
#您可以通过以下方式更新令牌:token.key=token.generate_key(),然后调用save()
json=serializer.data
json['token']=token.key
返回响应(serializer.data,status=status.HTTP\u 201\u已创建)
返回响应(serializer.errors,status=status.HTTP\u 400\u BAD\u请求)
我检查了这个代码,它对我有效serializer.save()
将返回一个用户实例,您可以将其传递给令牌模型的create()
方法
编辑
看完代码后,我可以说他试图创建一个自定义用户模型,而
AUTH\u user\u模型
设置不正确。此外,自定义模型名称为User
。正确设置并更改一些设置(USERNAME\u FIELD
在模型中)修复了问题。欢迎使用SO,@Samson Adejoro
正如@Nalin指出的,您可以使用Token.objects.create(user=request.user)
,这里的问题是您试图创建一个令牌,而用户已经有了一个令牌。可能在测试时,您已经为同一用户创建了一个令牌。用户
是令牌
模型中的OnetoOneField
字段
从文档:
一对一的关系。从概念上讲,这类似于
ForeignKey with unique=True,但关系的“反面”
将直接返回单个对象
在分配新令牌之前,清除先前令牌创建的令牌
Token.objects.filter(user=request.user).delete()
将Token.objects.create(users=users)
更改为Token.objects.create(user=users)
。这样做了。出现此错误:“/api/users/Cannot assign”“:“Token.user”必须是“user”实例。请尝试以下操作:Token.objects.create(user=request.user)
执行了该操作。出现此错误:“IntegrityError at/api/users/(1062,“key'user_id'”的重复条目'1')”AttributeError at/api/users/'Manager'对象没有属性'delete'my bad,忘记过滤用户。现在查一下。非常感谢你,纳林。我已经在LinkedIn上向您发送了一个连接请求。我真的很感激你。它仍然不起作用。它不是为每个用户生成令牌。它只为超级用户生成一个令牌…它不会为每个用户生成一个令牌。它将为登录用户生成令牌。那么您想为创建的用户生成令牌吗?我不可能在注册时为新用户分配令牌吗@Eliakin CostaI希望用户在注册时为其生成唯一的令牌。是的,您可以。如果您使用的是自定义模型,则确实需要将其作为AUTH\u USER\u model
添加到settings.py
文件中,或者只使用django.contrib.AUTH.models
中的USER
模型@萨姆索纳德约罗