Эквивалент get_or_create для добавления пользователей

Есть ли более простой способ добавить пользователя, чем со следующим шаблоном?

    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

Ответы

Ответ 1

Я так не думаю. Но вы можете проксифицировать пользователя 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

Ответ 2

В 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',
    )

Ответ 3

Лучше не ловить IntegrityError, как это может произойти по другим причинам. Вам нужно проверить, существует ли пользователь, за исключением пароля. Если пользователь уже существует, установите пароль.

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