自定义用户序列化程序在is\u valid()上给出错误

2024-05-16 05:26:45 发布

您现在位置:Python中文网/ 问答频道 /正文

出于某种原因,我没有使用表单模型来创建用户表单等等,所以我没有使用form.is_valid()

我在网上浏览了一下,然后被教导创建这样的序列化程序

from django.contrib.auth.models import User
from rest_framework import serializers


class UserModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'password']

我尝试在pythonshell中创建一个新的user对象,然后使用对象上的序列化程序,然后使用is_valid(),但是它给我的是false而不是true,而且创建的密码也不是散列的,它只是一个字符串

我在pythonshell中做了类似的事情。(也尝试了一个有身份证,但结果是一样的,所以我没有麻烦粘贴它再次)

user1 = User.objects.create(username='username', email='email@email.com', password='password')

user1_s = UserModelSerializer(user1)

当我运行user1_s时,出现了这个问题

UserModelSerializer(<User: username>):
id = IntegerField(label='ID', read_only=True)
username = CharField(help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, validators=[<django.contrib.auth.validators.ASCIIUsernameValidator object>, <UniqueValidator(queryset=User.objects.all())>])
email = EmailField(allow_blank=True, label='Email address', max_length=254, required=False)
password = CharField(max_length=128)

运行user1_s.data

{'username': u'username', 'password': u'password', 'id': 4, 'email': u'email@email.com'}

运行user1_s = UserModelSerializer(data=user1)

运行user1_s.is_valid()并返回False

运行user1_s.errors

{u'non_field_errors': [u'Invalid data. Expected a dictionary, but got User.']}

-------------------------- 有人能告诉我我做错了什么,并告诉我正确的方向吗?你知道吗

提前谢谢


Tags: 程序id表单data序列化isemailusername
1条回答
网友
1楼 · 发布于 2024-05-16 05:26:45

你有很多误解。你知道吗

首先,密码没有散列,因为您没有调用任何散列它的方法。创建用户时,必须始终调用create_user,而不是create;正是前者散列了密码。你知道吗

user1 = User.objects.create_user(username='username', email='email@email.com', password='password')

其次,错误消息中清楚地解释了user1_s无效的原因:当您要将数据传递到序列化程序并获取用户对象时,实际上需要传递数据字典,而不是用户对象。你知道吗

因此,作为一个测试,这将起作用:

user1_serialize = UserModelSerializer(user1)
data = user1_serialize.data
user1_deserialize = UserModelSerializer(data=data)
user1_deserialize.is_valid()

相关问题 更多 >