Как вызвать переменную из одного метода в другом в 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.

Вернуться на верх