Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 - Fatal编程技术网

Python 保存新用户时出现重复密钥错误

Python 保存新用户时出现重复密钥错误,python,django,Python,Django,我试图在django中保存一个用户和一个配置文件,它们使用oneToOneField链接在一起,但我收到一个错误消息 重复的键值违反了唯一约束 “身份验证用户用户名密钥” 即使我没有任何副本 我也得到了这个错误: 重复的键值违反了唯一约束 “api_配置文件_用户_id_密钥”详细信息:密钥(用户_id)=(9)已存在 这是我的密码: model.py from django.db import models from django.contrib.auth.models import User

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

重复的键值违反了唯一约束 “身份验证用户用户名密钥”

即使我没有任何副本

我也得到了这个错误:

重复的键值违反了唯一约束 “api_配置文件_用户_id_密钥”详细信息:密钥(用户_id)=(9)已存在

这是我的密码:

model.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)
view.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接收器中,但我不确定。

create_user
也在调用save(),然后您也调用了
user.save()
,post_save信号为一个用户调用了两次,您会收到错误,因为为一个用户创建了两个配置文件对象

你可以做:

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

这似乎不正确,因为它会查询数据库以查找代码中应该知道的内容。我在函数中添加了第三个参数
created
,并且我仅在标志为true时创建。这似乎已经修复了它