【问题标题】:Django Rest Framework How to call variable from one method in another?Django Rest Framework 如何在另一种方法中调用变量?
【发布时间】:2021-11-07 03:13:30
【问题描述】:

我试图在 Django 中使用 post()get() 两种方法仅使用一个视图类。 Post 用于获取我想在 "get()" 中提供的用户会话令牌,以便我可以识别当前用户并通过 Serializer 使用相同的视图发送用户详细信息。我想使用该令牌通过 user = Tokens.objects.get(key=token) 获取名称以获取用户名,然后过滤 User.objects.get(username=user) 在前端发布用户数据。我怎样才能在 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',
        )

这是我将令牌从前端发送到后端的模型:

class UserAccountTokenSend(models.Model):
    token = models.CharField(max_length=255)

这是我的 urls.py:

    path('get-user-tokens/', views.UserDetails.as_view()),
    path('get-user-details/', views.UserDetails.as_view()),

【问题讨论】:

    标签: javascript python django vue.js django-rest-framework


    【解决方案1】:

    找到了解决办法,看来你需要做以下事情:

    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 时,它可用于同一类中的所有方法类。

    【讨论】:

      【解决方案2】:

      我假设您使用的是 drf 的 authtoken 模型,并且您的令牌模型与用户具有一对一的关系字段。

      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")
          )
      

      所以在你的用户序列化器中

      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',
              )
      

      【讨论】:

      • 我不太明白如何使用它。在前端,我得到了显示令牌但不显示用户的 localStorage。这就是为什么我试图让它在 get() 中可用,以便我可以使用它来查找其他用户信息。
      猜你喜欢
      • 1970-01-01
      • 2014-12-18
      • 2022-01-23
      • 1970-01-01
      • 2020-06-18
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多