python - Django Token 对象更新错误:django.db.utils.IntegrityError: UNIQUE constraint failed: authtoken_token.user_id
问题描述
我正在使用 django 用户类和 rest_framework 令牌类来存储用户信息和令牌。同样,我正在使用serializers.ModelSerializer
类。但是当我发出更新请求(检查更新方法)来更新用户信息以及我拥有的令牌时,它给了我错误。
这是serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework.authtoken.views import Token
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'password']
extra_kwargs = {
'password' : {
'write_only':True,
'required': True
}
}
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
Token.objects.create(user=user) # create token for the user
return user
def update(self, instance, validated_data):
instance.username = validated_data['username']
instance.set_password(validated_data['password'])
instance.save()
Token.objects.update(user=instance)
return instance
视图.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAuthenticated, IsOwnerOfObject]
authentication_classes = (TokenAuthentication,)
网址.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('users', UserViewSet, basename = 'users')
urlpatterns = [
path('api/', include(router.urls)),
]
错误 :
django.db.utils.IntegrityError:唯一约束失败:authtoken_token.user_id
这就是我在标头字段中使用授权令牌发出请求的方式:
解决方案
此行无效:
Token.objects.update(user=instance)
在这里,您尝试更新 Token 对象而不指定哪个对象。您应该在更新之前.filter()
或之前执行此操作。.get()
但这种说法是多余的。想想看,您正在将令牌从“实例”更新为“实例”。所以,一切都会一样。尝试删除它,因为它没有任何效果。
推荐阅读
- node.js - 如何减少 Ionic 4 编译时间
- javascript - POST 后获取响应
- tsql - MS Access SQL Case When 表达式
- android - 编辑通话记录名称
- java - 使用接口类型访问类变量
- php - 无法从 jquery 数据刷新表的表结果的按钮上运行 jquery 函数
- cocoa - NSClipView bounds - 找出滚动位置的问题
- javascript - AudioBufferSourceNode.start() 仅在以偏移量启动时在 Safari 上失败
- php - [Route: editor.post] 缺少必需的参数
- azure-cosmosdb - CosmosDB 中相互熟人推荐的分区键