我使用 django 用戶類和 rest_framework Token 類來存盤用戶資訊和令牌。同樣,我正在使用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
這就是我使用標頭欄位中的授權令牌發出請求的方式:

uj5u.com熱心網友回復:
你想達到什么目的?
Token.objects.update(user=instance)
這沒有任何意義。是無WHERE clausule的更新。我認為你“想要”做這樣的事情。
Token.objects.filter(user=instance).update(user=instance)
該查詢實際上什么也沒做。我認為你真正想要的是令牌失效。您必須洗掉當前的并生成新的。
uj5u.com熱心網友回復:
此行無效:
Token.objects.update(user=instance)
在這里,您嘗試更新 Token 物件而不指定哪個物件。你應該做.filter()或.get()在更新之前。
但這種說法是多余的。想想看,您正在將令牌從“實體”更新為“實體”。所以,一切都會一樣。嘗試洗掉它,因為它沒有任何影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/334389.html
標籤:Python 姜戈 Django 休息框架 放 django-viewsets
下一篇:處理Django中的外鍵
