重复键值违反了Django中的唯一约束 [英] duplicate key value violates unique constraint in django

查看:60
本文介绍了重复键值违反了Django中的唯一约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我具有在Django中创建新用户的功能,如下所示:

I have function for creating new user in django as follows:

def initialize(username, password, email, title, firstName, lastName,  telephoneNumber, mobileNumber, smsActive, for_company_id = 1):
    sUsername = username.lower()
    if len(username) > 30:
        sUsername = username[:30].lower()
    user = User.objects.create_user(sUsername, email, password, last_login=datetime.datetime.now())
    user.first_name = firstName
    user.last_name = lastName
    user.save()
    userProfile = UserProfile(user = user, title = title, telephone = telephoneNumber, mobile = mobileNumber, smsActive = smsActive)
    userProfile.code2Factor = pyotp.random_base32()
    userProfile.forCompanyId = for_company_id
    userProfile.main_updated = datetime.datetime.now()
    userProfile.save()
    return userProfile

然后我按如下操作:

user_profile = initialize(input.user.username, password, '', input.title, input.user.first_name, input.user.last_name, input.telephone, input.mobile, sms_active)
user_profile.user.groups.set([Group.objects.get(id=gr.id) for gr in input.groups])
user_profile.cultureMajor = input.cultureMajor
user_profile.offerTax = input.offerTax if 'offerTax' in input else False
user_profile.user.save()

但是当我尝试创建新用户时,出现如下错误:

But when I try to create new user I get error as follows:

duplicate key value violates unique constraint "auth_user_pkey" DETAIL: Key (id)=(21811) already exists.

数据库中存在ID 21811 ,但最后一个是 25530 .

The id 21811 exists in the database but the last one is 25530.

为什么django不使用ID的第一个下一个号码?

Why django does not use the first next number for ID?

更新

  • 用户模型是django的标准模型.
  • UserProfile如下:

  • User model is standard model from django.
  • UserProfile is as follows:

class UserProfile(models.Model):
    forCompanyId = 1
    user = models.OneToOneField(to=User, on_delete=models.DO_NOTHING)
    title = models.CharField(max_length=10, null=True, blank=True)
    telephone = models.CharField(max_length=50, null=True, blank=True)
    mobile = models.CharField(max_length=50, null=True, blank=True)
    smsActive = models.BooleanField(default=False)
    car_by_car_notification = models.BooleanField(default=True)
    car_by_car_mail = models.BooleanField(default=True)
    daily_digest = models.BooleanField(default=True)
    offer_tax = models.BooleanField(default=False)
    cultureMajor = models.CharField(max_length=3, blank=False, default='en')
    cultureMinor = models.CharField(max_length=3, blank=True)
    modulesBlocked = models.ManyToManyField(to=Module, through='UserModuleBlocked')
    otherEmails = models.CharField(max_length=512, null=True, blank=True)
    otherContact = models.CharField(max_length=256, null=True, blank=True)
    browser = models.CharField(max_length=256, null=True, blank=True)
    picture = models.ImageField(upload_to=settings.MEDIA_ROOT, blank=True, null=True)
    code2Factor = models.CharField(max_length=256, null=True, blank=True)
    mobile2Factor = models.BooleanField(default=False)
    authenticator2Factor = models.BooleanField(default=False)
    main_user_id = models.IntegerField(null=True)
    main_updated = models.DateTimeField(_('date updated on main'), default=timezone.now)

推荐答案

我已经通过执行以下代码解决了该问题:

I've solved the problem by executing following code:

BEGIN;
SELECT setval(pg_get_serial_sequence('"auth_permission"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_permission";
SELECT setval(pg_get_serial_sequence('"auth_group_permissions"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_group_permissions";
SELECT setval(pg_get_serial_sequence('"auth_group"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_group";
SELECT setval(pg_get_serial_sequence('"auth_user_groups"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_user_groups";
SELECT setval(pg_get_serial_sequence('"auth_user_user_permissions"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_user_user_permissions";
SELECT setval(pg_get_serial_sequence('"auth_user"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_user";
COMMIT;

这篇关于重复键值违反了Django中的唯一约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆