我有在 django 中创建新用户的功能,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
然后我这样做:
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()
Run Code Online (Sandbox Code Playgroud)
但是当我尝试创建新用户时,出现如下错误:
duplicate key value violates unique constraint "auth_user_pkey" DETAIL: Key (id)=(21811) already exists.
Run Code Online (Sandbox Code Playgroud)
id21811存在于数据库中,但最后一个是25530.
为什么 django 不使用第一个下一个数字作为 ID?
更新
用户资料如下:
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)
Run Code Online (Sandbox Code Playgroud)这不是 Django 的问题
duplicate key violates a unique constraint
Run Code Online (Sandbox Code Playgroud)
当您创建重复密钥时会出现此消息。就您而言,这可能意味着您正在使用的表中的主键序列已不同步。这可能是由于手动导入造成的,当我遇到此问题时,这种情况经常发生。您必须手动重置主键索引。
我不确定你的数据库是什么,我将与你分享我用来修复它的粗略 Postgres SQL 命令,前两个命令允许你查看它是否不同步,最后一个命令将修复它。如果这还不够/它是一个不同的数据库,请评论
SELECT MAX('auth_user_pkey') FROM User;
SELECT nextval('auth_user_key_sequence');
SELECT setval('auth_user_key_sequence', (SELECT MAX(auth_user_pkey) FROM User)+1);
Run Code Online (Sandbox Code Playgroud)
我通过执行以下代码解决了这个问题:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3597 次 |
| 最近记录: |