IntegrityError:UNIQUE约束失败:user_userprofile.user_id

时间:2018-06-15 02:20:11

标签: django

我定义了额外的UserProfile以将User的属性扩展为

class UserProfile(models.Model):
    SEX = (
        (1, 'male'),
        (0, 'woman'),
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    sex = models.IntegerField(choices=SEX, default=1)
    location = models.CharField(max_length=30)
    about_me = models.TextField()

当我将UserProfile附加到Django shell中的现有用户

In[19]: for u in User.objects.all():
    ...:     profile = UserProfile(user=u)
    ...:     profile.save()

报告错误:

IntegrityError: UNIQUE constraint failed: user_userprofile.user_id

我检查了答案Django: Integrity error UNIQUE constraint failed: user_profile.user_id - Stack Overflow,但没有想法解决我的问题。

3 个答案:

答案 0 :(得分:1)

OneToOneField表示每个User只能有一个UserProfile。由于您将循环遍历每个User,因此它将失败 - 即违反定义OneToOneField的唯一数据库约束 - 如果存在任何UserProfiles

检查这一点的简单方法是查看UserProfile.objects.count()。如果答案不是0,那么根据定义,当您运行循环时,您将获得IntegrityError

答案 1 :(得分:1)

这非常简单,您在OneToOneUser之间定义了UserProfile关系,这意味着只有一个User一个且只有一个相关联 UserProfile

我不确定你的逻辑,不管怎么试试以下


for user in User.objects.all():
    if hasattr(user,'userprofile') and not user.userprofile:
        UserProfile.objects.create(user=user)

答案 2 :(得分:1)

我喜欢Jerin Peter George的答案,因为它不会对数据库产生影响,但是,如果您在迭代完成此过程时需要访问用户配置文件实例,您还可以使用绑定到该过程的内置get_or_create方法模特的经理。 。即

for u in User.objects.all():
    instance, created = UserProfile.objects.get_or_create(
        user=u, 
        defaults={#list of default keys and values})
    if created: 
        #update profile with form or other external data?
    else:
        #do other stuff 
    instance.save()

您还可以检查查询集的计数

user_profiles = UserProfile.objects.filter(user=u)
instance = None
if user_profiles.count() is 0:
    # user profile doesn't exist create one
    instance = UserProfile.objects.create(user=u)
else:
    # user profile exists
    instance = user_profiles[0]