【问题标题】:Django: Integrity error UNIQUE constraint failed: user_profile.user_idDjango:完整性错误唯一约束失败:user_profile.user_id
【发布时间】:2014-10-30 11:23:04
【问题描述】:

当我尝试编辑配置文件以将信息添加到 UserProfile 模型时,我收到了这个奇怪的错误:

IntegrityError at /profiles/edit/
UNIQUE constraint failed: user_profile.user_id

这里有什么问题,

型号:

class UserProfile(models.Model):

    user = models.OneToOneField(User)
    bio = models.TextField(blank=True)
    phone= models.CharField(max_length=10, blank=True)
    address = models.CharField(max_length=1024)
    age = models.PositiveIntegerField(blank=True,null=True)
    gender = models.IntegerField(choices=GENDER_CHOICES, default=1)

表格:

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        fields = ('phone','age','gender','address','bio')

查看:

def edit_profile(request):

    if request.method == 'POST':
        form = UserProfileForm(request.POST)
        print request.POST
        if form.is_valid():

            new_profile = UserProfile(
                            user = request.user,
                            bio = request.POST['bio'],
                            address = request.POST['address'],
                            age = request.POST['age']
                            )

            new_profile.save()

            return HttpResponseRedirect(reverse('user_public_profile', args=(request.user.username,)))
        return render(request,'users/edit_profile.html', {'form': form})

    else:
        form = UserProfileForm()
        return render(request,'users/edit_profile.html',
                          {'form': form})

【问题讨论】:

  • 不是针对您的问题,但是当我不小心更改 ModelForm.save(commit=False) 上的对象字段时遇到了同样的错误,或者至少它与我处理 commit 的方式有关。跨度>

标签: django


【解决方案1】:

这并不奇怪。您已经拥有该用户的个人资料,因此添加另一个会破坏唯一性约束。您需要编辑现有的,而不是添加新的。

另请注意,您在保存时没有使用已清理的表单数据,您应该这样做。要么使用form.cleaned_data['bio'] 等,或者更好的是只使用form.save(),这是使用模型表单的重点。

综合起来:

try:
    profile = request.user.userprofile
except UserProfile.DoesNotExist:
    profile = UserProfile(user=request.user)

if request.method == 'POST':
    form = UserProfileForm(request.POST, instance=profile)
    if form.is_valid():
        form.save()
        return redirect...
else:
    form = UserProfileForm(instance=profile)
return render...

【讨论】:

    【解决方案2】:

    我多次遇到同样的错误,我真的很沮丧,但最终还是找到了解决方案。

    转换:

    user = models.OneToOneField(User)
    

    user = models.ForeignKey(User)
    

    这应该可以解决问题。

    【讨论】:

    • 但是有人需要 OneToOneFields 那就错了
    • 这对我有用,但尝试注册用户时,我得到“用户”对象没有属性“配置文件”。我该如何解决这个问题?
    • @elderlee 你可以设置related_name="user" 使用profile.user
    • 拯救了我的一天,伙计
    • 我认为您应该将ForiegnKey 编辑为ForeignKey。它可能会绊倒初学者。
    【解决方案3】:

    在 UserProfileForm(request.POST) 中添加 (instance = request.user)

    【讨论】:

    • 欢迎来到stackoverflow。从您发布的内容中并不清楚应该将哪些代码添加到哪里。一些额外的推理词也会有所帮助。
    【解决方案4】:

    我不小心收到了这个错误,因为我在调用save 时忘记指定update_fields。我有:

    modified_instance.save(video_attr)
    

    我应该有的时候:

    modified_instance.save(update_fields=[video_attr])
    

    truthy 字符串被解释为位置force_update 参数,如果记录已经存在,这显然会导致问题。

    【讨论】:

      【解决方案5】:

      考虑这种情况:如果同一用户再次在 URL 'profile/edit' 上发出发布请求,那么您的代码将尝试使用同一用户实例创建新的 UserProfile,但由于这是一对一字段,而您已经使用该用户创建了一个配置文件,因此它将引发完整性错误。

      因此,您应该首先检查与该用户关联的配置文件是否已经存在,如果不存在则创建它。

      【讨论】:

        【解决方案6】:

        是的,您正在 User 和 UserProfile 模型之间建立 OneToOne 关系,这就是您面临完整性错误的原因, 要解决此问题,您可以将其更改为 ForeignKey 喜欢:

        class UserProfile(models.Model):
        
        user = models.ForeignKey(User,on_delete=models.CASCADE)
        bio = models.TextField(blank=True)
        ...
        ...
        

        【讨论】:

          猜你喜欢
          • 2018-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-24
          • 2021-06-10
          • 2015-08-10
          相关资源
          最近更新 更多