用于添加用户的等效get_or_create

Dav*_*542 19 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
Run Code Online (Sandbox Code Playgroud)

nu *_*est 19

在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',
    )
Run Code Online (Sandbox Code Playgroud)

  • 这不会为用户正确设置密码.原始的`password`字段包含salted哈希,而不是密码本身.您必须在新创建时对用户调用`set_password()`,然后再次保存(再次).不理想.顺便说一下,你可能想把它放在`defaults` kwarg中. (8认同)
  • 在这个例子中,`_ user`将是一个元组`(user_object,was_just_created)`. (2认同)

Chi*_*and 6

最好不要IntegrityError因为其他原因而抓住它.您需要检查用户是否存在,不包括密码.如果用户已存在,请设置密码.

user, created = User.objects.get_or_create(username=username, email=email)
if not created:
    user.set_password(password)
Run Code Online (Sandbox Code Playgroud)


nic*_*las 5

我不这么认为。但是您可以代理 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
Run Code Online (Sandbox Code Playgroud)

  • FWIW 捕获 IntegrityError 在这里看起来很奇怪,很奇怪,很奇怪。就像设计是倒退的。它是 *get_or_create* 所以尝试获取,捕获 User.DoesNotExist,然后尝试创建! (2认同)