我擴展了 TokenObtainPairSerializer,我的用戶模型將電子郵件作為 USERNAME_FIELD,但這種型別的用戶沒有電子郵件,而是我想使用自動生成的唯一 ID 來代替電子郵件進行身份驗證。
class MyTokenStudentSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
user = authenticate()(
student_id=attrs['student_id'], password=attrs['password'])
if user is not None:
if user.is_active:
data = super().validate(attrs)
refresh = self.get_token(self.user)
refresh['student_id'] = self.user.student_id
try:
data["refresh"] = str(refresh)
data["access"] = str(refresh.access_token)
data['student_id'] = self.user.student_id
data['firstname'] = self.user.firstname
data['middlename'] = self.user.middlename
data['lastname'] = self.user.lastname
data['phone'] = self.user.phone
data['last_login'] = self.user.last_login
data['joined_date'] = self.user.joined_date
except Exception as e:
raise serializers.ValidationError(
{'error': 'Something Wrong!'})
return data
else:
raise serializers.ValidationError(
{'error': 'Account is not activated'})
else:
raise serializers.ValidationError({
'error': 'Incorrect student id and password combination!'})
即使我沒有通過電子郵件欄位,這需要電子郵件和密碼,我如何讓它使用 student_id 而不是電子郵件。
uj5u.com熱心網友回復:
您可以username_field按如下方式覆寫:
還要小心使用 PasswordField,默認情況下它會修剪空格。你絕對不想password 成為有效的。
from rest_framework import serializers
rest_framework_simplejwt.serializers import PasswordField
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class MyTokenStudentSerializer(TokenObtainPairSerializer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['student_id'] = serializers.CharField(required=False)
self.fields['password'] = PasswordField(trim_whitespace=False)
username_field = 'student_id'
auth_fields = ['student_id']
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384121.html
標籤:姜戈 Django 休息框架 django-rest-framework-simplejwt
上一篇:如何從序列化程式更改模型ID?
