Django ValueError位于/api/users/Cannot query";“参孙”:必须是;“用户”;实例

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

在注册时为新用户生成令牌时出现问题

在对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.
在对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
模型@萨姆索纳德约罗