用于添加用户的等效get_or_create

时间:2011-09-22 07:52:38

标签: django

添加用户的方式是否比使用以下模式更简单?

    try:
        new_user = User.objects.create_user(username, email, password)
    except IntegrityError:
        messages.info(request, "This user already exists.")
    else:
        new_user.first_name = first_name
        # continue with other things

4 个答案:

答案 0 :(得分:16)

在Django 1.4中,用户存在get_or_create()。

from django.contrib.auth.models import User

_user = User.objects.get_or_create(
        username=u'bob',
        password=u'bobspassword',
    )

答案 1 :(得分:6)

最好不要抓住IntegrityError,因为其他原因会发生这种情况。您需要检查用户是否存在,不包括密码。如果用户已存在,请设置密码。

user, created = User.objects.get_or_create(username=username, email=email)
if not created:
    user.set_password(password)

答案 2 :(得分:4)

我不这么认为。但您可以代理Django用户:

class MyUser(User):
    class Meta:
        proxy = True

    def get_or_create(self, username, email, password, *args, **kwargs):
        try:
            new_user = User.objects.create_user(username, email, password)
        except IntegrityError:
            return User.objects.get(username=username, email=email)
        else:
            new_user.first_name = kwargs['first_name'] # or what you want
            ...etc...

        return new_user

答案 3 :(得分:-1)

此方法应解决此问题,但请记住,在数据库中,密码保留为密码的哈希值,如前所述,“get_or_create”进行精确查找。所以在查找实际发生之前,我们会从kwargs“弹出”密码。 自定义UserManager上的此方法:

def get_or_create(self, defaults=None, **kwargs):
    password = kwargs.pop('password', None)
    obj, created = super(UserManager, self).get_or_create(defaults, **kwargs)
    if created and password:
        obj.set_password(password)
        obj.save()
    return obj, created