Ошибка обновления объектов Django Token : django.db.utils.IntegrityError: UNIQUE constraint failed: authtoken_token.user_id

Я использовал класс django user и класс rest_framework Token для хранения информации о пользователе и токена. Для этого же я использовал класс serializers.ModelSerializer. Но когда я делаю запрос на обновление (проверяю метод update) для обновления информации о пользователе и токена, который у меня есть, он выдает ошибку.

Вот 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

.

Вот как я делаю запрос с маркером авторизации в поле заголовка:

enter image description here

Чего вы хотите достичь?

Token.objects.update(user=instance)

Это не имеет никакого смысла. Это обновление без условия WHERE. Я думаю, что вы "хотите" сделать что-то вроде этого.

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

Этот запрос на самом деле ничего не дает. Я думаю, что вы действительно хотите аннулировать токен. Вы должны удалить текущий и сгенерировать новый.

Эта строка недопустима:

Token.objects.update(user=instance)

Здесь вы пытаетесь обновить объект Token, не указывая, какой именно. Вы должны сделать .filter() или .get() перед обновлением.

Но это утверждение ошибочно. Подумайте, вы обновляете маркер с 'instance' на 'instance'. Таким образом, все будет одинаково. Попробуйте удалить его, так как он не имеет никакого эффекта.

Вернуться на верх