0

我正在使用 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

这就是我在标头字段中使用授权令牌发出请求的方式:

在此处输入图像描述

4

2 回答 2

2

此行无效:

Token.objects.update(user=instance)

在这里,您尝试更新 Token 对象而不指定哪个对象。您应该在更新之前.filter()或之前执行此操作。.get()

但这种说法是多余的。想想看,您正在将令牌从“实例”更新为“实例”。所以,一切都会一样。尝试删除它,因为它没有任何效果。

于 2021-10-23T16:19:01.547 回答
1

你想达到什么目标?

Token.objects.update(user=instance)

这没有任何意义。它是没有 WHERE 子句的更新。

我认为你“想要”做这样的事情。

Token.objects.filter(user=instance).update(user=instance)

该查询实际上什么也没做。

我认为您真正想要的是令牌失效。您必须删除当前的并生成新的。

于 2021-10-23T16:15:13.970 回答