【问题标题】:Duplicate key error when saving a new user保存新用户时出现重复键错误
【发布时间】:2019-11-08 18:56:29
【问题描述】:

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

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

尽管我没有任何重复。

我也收到此错误:

重复键值违反唯一约束 "api_profile_user_id_key" DETAIL: Key (user_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 接收器上,但我不确定。

【问题讨论】:

    标签: python django


    【解决方案1】:

    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)
    

    【讨论】:

    • 这似乎不对,因为它会在数据库中查询代码中应该知道的内容。我在函数中添加了第三个参数created,并且仅在标志为真时才创建。这似乎已经解决了它
    猜你喜欢
    • 2021-04-27
    • 2022-08-24
    • 2011-07-21
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多