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

时间:2013-11-04 13:53:11

标签: python django django-rest-framework

在django中,创建用户具有与通常的模型实例创建不同且唯一的流程。您需要拨打create_user()这是BaseUserManager的方法。

由于django REST框架的流程是restore_object()然后是save_object(),因此无法在通用创建API端点中使用ModelSerializer创建用户,而无需通过

解决这个问题的干净方法是什么?或者至少让它使用django的内置滚边工作?

修改

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

4 个答案:

答案 0 :(得分:2)

最终我覆盖了序列化程序的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

谢谢大家的帮助!

答案 1 :(得分:1)

解决此问题的另一种方法是覆盖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(2个位置的最后一行)。

答案 2 :(得分:0)

我正在与DRF合作。以下是我创建用户的方式:

我有一个带有覆盖保存方法的Serializer:

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)

答案 3 :(得分:0)

您似乎应该在序列化程序中覆盖restore_object(),而不是save()。这将允许您正确创建对象。

然而,看起来你正试图滥用框架 - 你试图让一个create()创建两个对象(用户和配置文件)。我不是DRF专家,但我怀疑这可能会引起一些问题。

使用自定义用户模型(在同一对象中也包含配置文件)可能会做得更好。