двойное значение ключа нарушает уникальное ограничение в Django - PullRequest
0 голосов
/ 24 мая 2019

У меня есть функция для создания нового пользователя в 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

Затем я делаю это следующим образом:

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()

Но когда я пытаюсь создать нового пользователя, я получаюошибка выглядит следующим образом:

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

Идентификатор 21811 существует в базе данных, но последний - 25530.

Почему django не использует первый следующий номер для идентификатора?

ОБНОВЛЕНИЕ

  • Пользовательская модель является стандартной моделью от Django.
  • UserProfile выглядит следующим образом:

    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)
    

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Я решил проблему, выполнив следующий код:

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;
0 голосов
/ 24 мая 2019

Это не проблема с Django

duplicate key violates a unique constraint

Это сообщение появляется при создании дубликата ключа.В вашем случае это, вероятно, означает, что последовательность первичных ключей в таблице, с которой вы работаете, вышла из синхронизации.Это может быть из-за ручного импорта, что часто случается со мной, когда у меня возникла эта проблема.Вы должны вручную сбросить индекс первичного ключа.

Я не уверен, какая у вас база данных, я поделюсь с вами грубыми командами 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...