Как вызвать переменную из одного метода в другом в Django?
Я пытаюсь использовать только один класс View в Django с двумя методами post() и get(). Post используется для получения токена сессии пользователя, который я хочу сделать доступным в "get()", чтобы я мог идентифицировать текущего пользователя и отправить данные пользователя, используя то же представление через Serializer. Я хочу использовать этот токен для получения имени user = Tokens.objects.get(key=token) для получения имени пользователя и затем фильтровать User.objects.get(username=user) для отправки данных пользователя во фронт-энд. Как я могу сделать "token" доступным внутри def get(), чтобы я мог работать с ним? Спасибо!
Это мой View.py:
class UserDetails(APIView):
def post(self, request, *args):
serializer = UserAccountTokenSendSerializer(data=request.data)
if serializer.is_valid():
global token
token = serializer.validated_data['token']
self.get(token)
# user = Token.objects.get(key=token).user
# global current_user
# current_user = User.objects.get(username=user)
# email = User.objects.get(email=user)
# print(current_user, email)
return Response(serializer.data)
def get(self, request, *tokens):
username = Token.objects.get(key=token).user
email = User.objects.get(username=username).email
serializer = UserAccount(username, email, many=True)
return Response(serializer.data)
Вот мои 2 сериализатора для отправки и получения данных:
class UserAccountTokenSendSerializer(serializers.ModelSerializer):
class Meta:
model = UserAccountTokenSend
fields = (
'token',
)
class UserAccount(serializers.ModelSerializer):
class Meta:
model = User
fields = (
'first_name',
'last_name',
'email',
'username',
)
Это мой urls.py:
path('get-user-tokens/', views.UserDetails.as_view()),
path('get-user-details/', views.UserDetails.as_view()),
Я предположу, что вы используете модель authtoken в drf и ваша модель токенов имеет поле связи один к одному с пользователем.
class Token(models.Model):
key = models.CharField(_("Key"), max_length=40, primary_key=True)
user = models.OneToOneField(
settings.AUTH_USER_MODEL, related_name='auth_token',
on_delete=models.CASCADE, verbose_name=_("User")
)
Так что в вашем сериализаторе User
class UserAccount(serializers.ModelSerializer):
token = serializers.CharField(source='token.key', read_only=True)
class Meta:
model = User
fields = (
'first_name',
'last_name',
'email',
'username',
'token',
)
Нашел решение, похоже, что вам нужно сделать следующее:
class UserDetails(APIView):
def post(self, request, *args, **kwargs):
serializer = UserAccountTokenSendSerializer(data=request.data)
# GLOBAL MAKES IT AVAILABLE FOR ALL METHODS IN THAT CLASS
global token
if serializer.is_valid():
token = serializer.validated_data['token']
return Response(serializer.data)
def get(self, request, *args, **kwargs):
user = Token.objects.get(key=token).user
details = User.objects.get(username=user)
print('#########################################', user)
serializer = UserAccount(details, many=True)
return Response(serializer.data)
Вам не нужно ничего делать, потому что из того, что мне удалось найти, следует, что если вы публикуете данные из сериализатора в Class, когда вы объявляете переменную как Global, она становится доступной для всех методов в том же Class.