首页 > 解决方案 > 保存新用户时出现重复键错误

问题描述

我正在尝试在 django 中保存一个用户和一个配置文件,它们使用 a 链接在一起,oneToOneField但我收到一条错误消息

重复键值违反唯一约束“auth_user_username_key

尽管我没有任何重复。

我也收到此错误:

重复键值违反唯一约束“api_profile_user_id_key” 详细信息:键 (user_id)=(9) 已存在。

这是我的代码:

模型.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models import CharField, OneToOneField
from django.db.models.signals import post_save
from django.dispatch import receiver


class Profile(models.Model):
    user = OneToOneField(User, on_delete=models.CASCADE)
    phone_number = CharField(max_length=20)
    account_type = CharField(max_length=10, default='basic')
    facebook_id = CharField(max_length=20, blank=True)
    google_id = CharField(max_length=20, blank=True)
    notification_id = CharField(max_length=40, blank=True)
    # TODO add account info and watchlist

    def __str__(self):
        return self.user.email


@receiver(post_save, sender=User)
def user_save(sender, instance, **kwargs):
    Profile.objects.create(user=instance)

视图.py:

@api_view(['POST'])
def sign_up(request):
    data = request.data
    user = User.objects.create_user(username=data['username'],
                                    password=data['password'],
                                    first_name=data['first_name'],
                                    last_name=data['last_name'],
                                    email=data['email']
                                    )
    user.profile.phone_number = data['phone_number']
    user.save()
    return Response('hey')

我认为问题出在 post_save 接收器中,但我不确定。

标签: pythondjango

解决方案


create_user也调用了 save(),然后你也调用user.save()了,post_save 信号为一个用户调用了两次,你得到错误,因为正在为一个用户创建两个 Profile 对象

你可以这样做:

@receiver(post_save, sender=User)
def user_save(sender, instance, **kwargs):
    Profile.objects.get_or_create(user=instance)

推荐阅读