Ошибка обновления объектов 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
.
Вот как я делаю запрос с маркером авторизации в поле заголовка:
Чего вы хотите достичь?
Token.objects.update(user=instance)
Это не имеет никакого смысла. Это обновление без условия WHERE. Я думаю, что вы "хотите" сделать что-то вроде этого.
Token.objects.filter(user=instance).update(user=instance)
Этот запрос на самом деле ничего не дает. Я думаю, что вы действительно хотите аннулировать токен. Вы должны удалить текущий и сгенерировать новый.
Эта строка недопустима:
Token.objects.update(user=instance)
Здесь вы пытаетесь обновить объект Token, не указывая, какой именно. Вы должны сделать .filter()
или .get()
перед обновлением.
Но это утверждение ошибочно. Подумайте, вы обновляете маркер с 'instance' на 'instance'. Таким образом, все будет одинаково. Попробуйте удалить его, так как он не имеет никакого эффекта.