Django - 重复键值违反了唯一约束条件

问题描述:

在我的Django项目中,我创建了一个应用程序以获得有关已注册用户的其他信息。所以,我的模式是这样的:Django - 重复键值违反了唯一约束条件

class UserProfile(models.Model): 
    class Meta: 
     verbose_name_plural = u'User Profile' 

    user = models.OneToOneField(User) 
    birthday = models.DateField(blank=True, null=True) 
    avatar = models.ImageField(upload_to='media/profile/avatar', blank=True, null=True) 
    name = models.CharField(blank=True, null=True, max_length=20) 
    surname = models.CharField(blank=True, null=True, max_length=50) 
    phone = models.CharField(blank=True, null=True, max_length=12) 

    def __unicode__(self): 
     return '%s' % self.user 

这里是我的登记表:

​​3210

这里是查看我的登记表:

def UserProfileRegistration(request): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect('/profile/') 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      user = User.objects.create_user(username=form.cleaned_data['username'], email=form.cleaned_data['email'], password=form.cleaned_data['password']) 
      user.save() 
      user_profile = UserProfile(user=user) 
      user_profile.save() 
      return HttpResponseRedirect('/profile/') 
     else: 
      return render(request, 'profiles/registration.html', {'form':form}) 
     else: 
      form = RegistrationForm() 
      context = {'form':form} 
      return render (request, 'profiles/registration.html', context) 

在用户配置文件我创建的ModelForm哪里用户可填写UserProfile模型中的字段:

class ExtraProfileDataForm(ModelForm): 
    name = forms.CharField(label=(u'Enter your name')) 
    surname = forms.CharField(label=(u'Enter your surname')) 
    phone = forms.CharField(label=(u'Enter your phone')) 
    birthday = forms.DateField(label=(u'Enter birthday')) 
    avatar = forms.ImageField(label=(u'Enter avatar')) 

    class Meta: 
     model = UserProfile 
     fields = ('name', 'surname', 'phone', 'birthday', 'avatar') 

    def __init__(self, *args, **kwargs): 
     super(ExtraProfileDataForm, self).__init__(*args, **kwargs) 
     for key in self.fields: 
      self.fields[key].required = False 

这是模型形式的看法:

@login_required 
def UserFullDataForm(request): 
    if request.method == 'POST': 
     form = ExtraProfileDataForm(request.POST) 
     if form.is_valid(): 
      profile_user = request.user 
      user_profile = UserProfile(user=profile_user) 
      user_profile.name = form.cleaned_data['name'] 
      user_profile.surname = form.cleaned_data['surname'] 
      user_profile.phone = form.cleaned_data['phone'] 
      user_profile.birthday = form.cleaned_data['birthday'] 
      user_profile.avatar = form.cleaned_data['avatar'] 
      user_profile.save() 
      return HttpResponseRedirect('/profile/') 
      else: 
      return render(request, 'profiles/extra_profile.html', {'form':form}) 
     else: 
      form = ExtraProfileDataForm() 
      context = {'form':form} 
      return render (request, 'profiles/extra_profile.html', context) 

但是,当我填写此表,我得到了错误: duplicate key value violates unique constraint "profiles_userprofile_user_id_key" DETAIL: Key (user_id)=(23) already exists. 在追踪我看到这个错误在这行user_profile.save()。据我了解,发生这种情况是因为此脚本使用相同的ID创建新项目,但未更新它。我必须更改我的代码来更新现有项目,但不创建。谢谢。

您需要使用get_or_create,如果发现它将返回一个现有项目;否则创建一个新的模型实例。

在用户配置文件更新视图:

user_profile, created = UserProfile.objects.get_or_create(user=profile.user) 

现在,而不是每次都创建一个新的配置文件 - 要更新,如果该用户的配置文件已存在。

+0

非常感谢你的工作! –