Python 获取或创建抛出完整性错误
鉴于object.get\u或_create()的全部目的是获取对象(如果对象已经存在),我不明白它为什么会抛出此代码的完整性错误:Python 获取或创建抛出完整性错误,python,django,django-forms,Python,Django,Django Forms,鉴于object.get\u或_create()的全部目的是获取对象(如果对象已经存在),我不明白它为什么会抛出此代码的完整性错误: class UserAdd(TemplateView): def post(self, request, *args, **kwargs): context = self.get_context_data(*args, **kwargs) form = UserAddForm(request.POST) if form.is_valid(
class UserAdd(TemplateView):
def post(self, request, *args, **kwargs):
context = self.get_context_data(*args, **kwargs)
form = UserAddForm(request.POST)
if form.is_valid():
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
myemail = form.cleaned_data['email']
mypass = form.cleaned_data['password']
if myemail and mypass:
myuser,created = User.objects.get_or_create(email=myemail, username=myemail, first_name=first_name, last_name=last_name)
if created:
myuser.set_password(mypass)
return HttpResponseRedirect('/')
以下是错误:
django.db.utils.IntegrityError IntegrityError: (1062, "Duplicate entry 'user@domain.com' for key 'username_UNIQUE'")
有人知道发生了什么吗?您要求django根据以下四个条件获取记录:
- 电子邮件
- 用户名
- 名字
- 姓
myuser, created = User.objects.get_or_create(
username=myemail, defaults={'first_name': first_name, 'last_name': last_name, 'email': myemail})
发送到
get\u或\u create
方法的参数需要精确匹配,否则django的ORM将尝试创建一个新对象,并且由于主键/唯一列约束将被违反,因此您将得到错误
试试这个:
if form.is_valid():
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
myemail = form.cleaned_data['email']
mypass = form.cleaned_data['password']
if myemail and mypass:
myuser,created = User.objects.get_or_create(email=myemail, defaults = {'username': myemail, 'first_name': first_name, 'last_name': last_name})
if created:
myuser.set_password(mypass)
return HttpResponseRedirect('/')
阅读更多关于。
defaults=
参数就是您所需要的 在重新定义model的save()
方法之后,我遇到了类似的错误。事实证明,如果在模型中多次调用save
,所有后续调用都应该使用force\u insert=True
关键字参数进行。在我的例子中,我必须在第二次调用时将self.save(*args,**kwargs)
更改为self.save()
,以消除错误。
有关更多详细信息,请阅读此处:存在使用此用户名的用户,但不使用这些名字、姓氏或电子邮件。您不能将密码设置为默认值吗?否,因为
设置密码
会将密码散列并存储在数据库中。这是正确的做法。在设置密码后,我还需要myuser.save()。此答案不正确。如果没有记录,get_或_create就会创建它。这就是get_或_create的用途,用户已经在使用它了。显示IntegrityError是因为唯一约束失败。