【问题标题】:Django REST framework - How to create a UserSerializer object but not return the password? [duplicate]Django REST 框架 - 如何创建 UserSerializer 对象但不返回密码? [复制]
【发布时间】:2015-05-04 17:49:40
【问题描述】:

我正在使用位于

中的内置用户模型
django.contrib.auth.models

这是我的 serialiers.py 文件:

from rest_framework import serializers

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', )

现在,我想要的是当我像这样序列化一个用户对象时:

user = User.objects.get(pk=1)
serialzer=UserSerializer(user)
return Response(serializer.data)

我只想将“用户名”作为 JSON 对象返回给前端(我不想返回密码)。这很好用,但是当我尝试使用此视图创建用户对象时:

@api_view(['POST'])
def users(request):
    """
    Create a new user.
    """
    if request.method == 'POST':
        serializer = UserSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

无需用户输入密码即可创建用户对象(我试过了

curl -X POST localhost:8000/user -d "username=testUser"
# the above URL (localhost:8000/user) calls the "users" view

并且它成功地创建了一个仅使用给定用户名的用户)。如何做到这一点,以便在创建用户时,只有在给出有效的用户名和密码时才能成功创建用户(因为位于 django.contrib.auth.models 中的“用户”模型需要有效的用户名和密码)?

【问题讨论】:

    标签: django serialization django-models django-rest-framework user-registration


    【解决方案1】:

    从返回的成功响应中弹出

    serializer.data.pop('password', None)
    

    我忘了数据是在response之前还是在response之后序列化的,如果是之前序列化的,那么一定要用json库转换,去掉password key,重新序列化,再发送。

    【讨论】:

    • 当我使用那行代码时,它首先给我一个错误,说 pop 只需要 1 个参数。我删除了“None”并尝试了“serializer.data.pop('password')”,现在它给了我一个 TypeError 说“ExceptionValue:对象不能被解释为整数”。
    • 忽略这不起作用的事实,如果有人忘记在传回数据之前将其从数据中弹出,它仍然会打开揭示哈希的大门。您应该使用write_only 字段,就像我在the duplicate question 中解释的那样。
    • 很高兴不知道密码上有那个选项,如果您将数据转储到 python 然后重新序列化,我的解决方案确实有效,但有效并不意味着良好的做法 gj。
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2017-08-21
    • 2019-06-14
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多