python - 保存新用户时出现重复键错误
问题描述
我正在尝试在 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 接收器中,但我不确定。
解决方案
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)
推荐阅读
- xcode - 昨天搭建成功后没有这个Module
- python - 用于构造越来越长的函数的 Python 循环
- pandas - 根据熊猫中的前三行转换数据框
- ruby-on-rails - 当我使用 image_tag 在 Rails 6 上显示照片时,为什么我的 Rails 应用程序会中断?
- python - 无法解析位置 0 处的字符串问题
- algorithm - Golang 指向切片的指针
- c# - 如何让我的游戏对象实现我的界面
- python - 如何从动态表格小部件连接组合框?
- reactjs - 是否可以在外部函数(另一个文件)中修改反应功能组件的状态?
- python - 我应该将 XPath 与抓取代码分开吗?