Эквивалент get_or_create для добавления пользователей - PullRequest
18 голосов
/ 22 сентября 2011

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

    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 ]

16 голосов
/ 26 апреля 2014

В 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',
    )
6 голосов
/ 13 марта 2017

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

user, created = User.objects.get_or_create(username=username, email=email)
if not created:
    user.set_password(password)
4 голосов
/ 22 сентября 2011

Я так не думаю.Но вы можете указать пользователя 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
0 голосов
/ 02 апреля 2018

Этот метод должен решить эту проблему, но имейте в виду, что в базе данных пароль хранится как хеш пароля, и, как указывалось ранее, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...