Django Token objects update error : django.db.utils.IntegrityError: UNIQUE constraint failed: authtoken_token.user_id
Django Token objects update error : django.db.utils.IntegrityError: UNIQUE constraint failed: authtoken_token.user_id
我正在使用 django 用户 class 和 rest_framework 令牌 class 来存储用户信息和令牌。同样,我使用的是 serializers.ModelSerializer
class。但是当我发出更新请求(检查更新方法)以更新用户信息以及我拥有的令牌时,它给我错误。
这里是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
views.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAuthenticated, IsOwnerOfObject]
authentication_classes = (TokenAuthentication,)
urls.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: UNIQUE constraint failed:
authtoken_token.user_id
这就是我在 header 字段中使用授权令牌发出请求的方式:
你想达到什么目的?
Token.objects.update(user=instance)
没有任何意义。它是没有 WHERE 子句的更新。
我认为你“想要”做这样的事情。
Token.objects.filter(user=instance).update(user=instance)
该查询实际上没有任何作用。
我认为您真正想要的是令牌失效。您必须删除当前的并生成新的。
此行无效:
Token.objects.update(user=instance)
在这里,您试图更新一个 Token 对象,但没有指定是哪一个。您应该在更新前执行 .filter()
或 .get()
。
但这句话是多余的。想一想,您正在将令牌从 'instance' 更新为 'instance'。所以,一切都会一样。尝试删除它,因为它没有任何效果。
我正在使用 django 用户 class 和 rest_framework 令牌 class 来存储用户信息和令牌。同样,我使用的是 serializers.ModelSerializer
class。但是当我发出更新请求(检查更新方法)以更新用户信息以及我拥有的令牌时,它给我错误。
这里是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
views.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAuthenticated, IsOwnerOfObject]
authentication_classes = (TokenAuthentication,)
urls.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: UNIQUE constraint failed: authtoken_token.user_id
这就是我在 header 字段中使用授权令牌发出请求的方式:
你想达到什么目的?
Token.objects.update(user=instance)
没有任何意义。它是没有 WHERE 子句的更新。
我认为你“想要”做这样的事情。
Token.objects.filter(user=instance).update(user=instance)
该查询实际上没有任何作用。
我认为您真正想要的是令牌失效。您必须删除当前的并生成新的。
此行无效:
Token.objects.update(user=instance)
在这里,您试图更新一个 Token 对象,但没有指定是哪一个。您应该在更新前执行 .filter()
或 .get()
。
但这句话是多余的。想一想,您正在将令牌从 'instance' 更新为 'instance'。所以,一切都会一样。尝试删除它,因为它没有任何效果。