【问题标题】:drf user serializer return custom datadrf 用户序列化程序返回自定义数据
【发布时间】:2021-10-28 01:46:16
【问题描述】:

我一直在尝试创建一个 drf 应用,并希望实现一个可以做两件事的登录视图:

  1. 自动设置 cookie
  2. 返回用户的url和用户名

问题出在序列化程序代码中的 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

            user = UserLoginSerializer(data=request.data)
            
            user = user.validate(data=request.data) if user.is_valid()
            response.data["user"] = user.data if user.is_valid() else user.errors
        return super().finalize_response(request, response, *args, **kwargs)

序列化器.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)

如您所见,验证选项正在尝试获取用户名和 url 数据以返回它,但它正在尝试创建一个新帐户。所以也许验证选项不正确。我研究了 drf 文档,但似乎有一个完全不同的函数,称为 create。所以我不知道 validate 是如何不起作用的。也许我应该输入另一个函数

【问题讨论】:

    标签: python django serialization django-rest-framework django-serializer


    【解决方案1】:

    在您的验证功能中,您无法访问self['username'] - 您只能通过self.instance 访问用户数据;但是,否则,您只有在将实例传递给序列化程序时才能访问该实例,例如:

    user_serializer = UserLoginSerializer(data=request.data, instance=user_obj)
    

    用户登录后你需要什么,所以我向你推荐这个帖子:Login and Register User Django Rest Framewrok;我很确定你可以在那里得到你需要的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多