【问题标题】:custome user serializer giving error on is_valid() - django自定义用户序列化程序在 is_valid() 上给出错误 - django
【发布时间】:2017-06-06 10:40:36
【问题描述】:

由于某种原因,我没有使用表单模型来创建用户表单等等,所以我没有使用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']

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

我在 python shell 中做了类似的事情。 (也尝试了一个也有 id 但结果是一样的,所以我没有费心再次粘贴它)

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.']}

------------------------------------ 有人可以让我知道我做错了什么并指导我正确的方向吗?

提前致谢

【问题讨论】:

    标签: python django validation object serialization


    【解决方案1】:

    您在这里有许多误解。

    首先,密码没有经过哈希处理,因为您没有调用任何对其进行哈希处理的方法。创建用户时,必须始终调用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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-08
      • 2016-11-28
      • 1970-01-01
      • 2018-12-10
      • 2014-10-31
      • 2015-01-12
      • 1970-01-01
      • 2015-01-13
      相关资源
      最近更新 更多