如何使用DRF的ModelSerializer创建一个django用户

在Django中,创建一个User有与通常的Model实例创建不同且独特的流程。 你需要调用create_user()这是BaseUserManager一个方法。

由于django REST框架的流程是执行restore_object() ,然后执行save_object() ,因此不可能在通用的create API端点中简单地使用ModelSerializer创建用户,而不会破解你的方法。

什么将是一个干净的方式来解决这个问题? 或者至少让它使用django的内置管道工作?

编辑:

重要的是要注意,特别不起作用的是,一旦你尝试使用django.contrib.auth.authenticate验证创建的用户实例,如果实例仅仅是使用User.objects.create()而不是.create_user()创建的,则它会失败。


最终我重写了序列化器的restore_object方法,并确保发送的密码是使用instance.set_password(password) ,如下所示:

def restore_object(self, attrs, instance=None):
    if not instance:
        instance = super(RegisterationSerializer, self).restore_object(attrs, instance)
    instance.set_password(attrs.get('password'))
    return instance

感谢大家的帮助!


解决这个问题的另一种方法是在pre_save(self, obj)的扩展中覆盖pre_save(self, obj)方法, viewsets.GenericViewSet所示:

def pre_save(self, obj):
    """ We have to encode the password in the user object that will be
    saved before saving it.
    """
    viewsets.GenericViewSet.pre_save(self, obj)
    # Password is raw right now, so set it properly (encoded password will
    # overwrite the raw one then).
    obj.user.set_password(obj.user.password)

编辑:

请注意,上面代码中的obj包含User类的实例。 如果直接使用Django的用户模型类, obj.user用代码中的obj替换obj.user (最后一行放在两处)。


我正在与DRF合作。 这里是我如何创建用户:

我有一个Serializer with overrided save方法:

def save(self, **kwargs ):
    try:
        user = create_new_user(self.init_data)
    except UserDataValidationError as e:
        raise FormValidationFailed(e.form)
    self.object = user.user_profile
    return self.object

create_new_user只是我创建用户的函数,在视图中,我只有:

def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs)
链接地址: http://www.djcxy.com/p/17031.html

上一篇: How to create a django User using DRF's ModelSerializer

下一篇: PostgreSQL: Terribly slow ORDER BY with primary key as the ordering key