Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 等同于用于添加用户的get_或_create_Django - Fatal编程技术网

Django 等同于用于添加用户的get_或_create

Django 等同于用于添加用户的get_或_create,django,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 #

有没有比使用以下模式更简单的方法来添加用户

    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

我不这么认为。但您可以代理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

在Django 1.4中,用户存在get_或_create()

from django.contrib.auth.models import User

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

最好不要捕捉到IntegrityError,因为它可能由于其他原因发生。您需要检查用户是否存在,密码除外。如果用户已存在,请设置密码

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

这个方法应该可以解决这个问题,但要记住,在数据库中,密码是作为密码的散列保存的,正如前面指出的,“get_或_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

现在是的,请看@nu珠穆朗玛峰的答案。FWIW捕捉完整性错误看起来很奇怪,奇怪,奇怪。好像设计是倒退的。它是get_或_create,所以请尝试获取,捕获User.DoesNotExist,然后尝试创建!在本例中,
\u user
将是一个元组
(user\u对象,是刚刚创建的)
。这不会正确设置用户的密码。原始
password
字段保存的是咸散列,而不是密码本身。新创建用户时,您必须调用
set_password()
,然后(再次)保存它。不理想。顺便说一句,无论如何,您可能希望将其置于
默认值
kwarg中。虽然这可能会回答问题,但添加一些注释或解释代码解决问题的原因总是有帮助的。最好不要无故重写基本用户类。只需在别处定义此函数。我认为这需要在
user.set\u password()
之后再
user.save()
,否则密码将无法保存。