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()
,否则密码将无法保存。