Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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
Python 获取或创建抛出完整性错误_Python_Django_Django Forms - Fatal编程技术网

Python 获取或创建抛出完整性错误

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(

鉴于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():
        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是因为唯一约束失败。