Пользовательский сериализатор drf возвращает пользовательские данные
Я пытался создать приложение drf и хотел добиться представления входа, которое выполняло бы две задачи:
- set's the cookies automatically
- returns the url and the username of the user
проблема конкретно в функции validate внутри кода сериализатора
views.py:
class CookieTokenObtainPairView(TokenObtainPairView):
def finalize_response(self, request, response, *args, **kwargs):
if response.data.get("refresh"):
# the cookie part works well
# the part that doesn't is in the serializer below
# tried to do the UserLoginSerializer(data=request.data)
user = UserLoginSerializer.validate(data=request.data)
if user.is_valid():
user = user.validate(data=request.data)
response.data["user"] = user.data if user.is_valid() else user.errors
else:
response.data["user"] = user.errors
return super().finalize_response(request, response, *args, **kwargs)
serializers.py
class UserLoginSerializer(serializers.HyperlinkedModelSerializer):
password = serializers.CharField(style={"input type": "password"}, write_only=True)
#
class Meta:
model = User
fields = (
"id",
"url",
"username",
"password",
)
# read_only_fields = ("id")
def validate(self, data):
data["username"] = self["username"]
data["password"] = self["url"]
return super().validate(data)
как вы видите, опция validate пытается получить имя пользователя и данные url, чтобы вернуть его, но я не нахожу хорошего способа получить их каждый раз, когда он говорит, что у self нет значения username или что-то еще, пробовал все эти варианты:
- self.username
- self["username"]
- self.get["username"]
- self.get.username
Так что любой хороший способ вернуть нужные мне значения я надеюсь на вашу помощь
В вашей функции validate вы не можете получить доступ к self['username']
- вы можете получить доступ к пользовательским данным только через self.instance
; но, в противном случае, вы можете получить доступ к экземпляру, только если вы передали его сериализатору в конструкции типа:
user_serializer = UserLoginSerializer(data=request.data, instance=user_obj)
Что вам нужно после входа пользователя в систему, поэтому я рекомендую вам этот пост: Login and Register User Django Rest Framewrok; я почти уверен, что вы сможете получить то, что вам нужно там.