Удаление пользователя влияет на инкрементную уникальную ссылку, которая использует подсчет совпадающих результатов. Как сохранить инкремент?

По разным причинам мне может понадобиться удалить пользователя. Мягкое удаление, при котором я просто удаляю всю идентифицируемую информацию, оставляя некоторую анонимизированную, может оказаться невозможным. Кроме того, если я удалю пользователя внутри сайта django admin, то это будет жесткое удаление.

Проблема заключается в том, что у меня есть модель для пользователя, которая включает имя_фамилию, фамилию_фамилию, имя_компании, reference_id и т.д. Reference_id создается путем использования первых 3 согласных букв фамилии, первых 3 букв имени и затем инкрементного трехзначного числа, начинающегося с 001. Если в каком-либо имени меньше 3 букв, то недостающие буквы заменяются символом "X". Числовая часть использует поиск по модели с первыми 6 буквами, подсчетом количества результатов, увеличением на 1 и использованием zfill для заполнения недостающего количества цифр. Полный reference_id выглядит следующим образом: MDVTAS001, например:

first_name_tres = first_name.lower()[0:3].ljust(3,'x')
print("first name 3: " + first_name_tres)
last_name_tres = last_name.lower().translate({ord(i): None for i in 'aeiou'})[0:3].ljust(3,'x')
print("last name 3: " + last_name_tres)
user_ref_count =  str(ProfileMember.objects.filter(reference_id__contains=(last_name_tres + first_name_tres)).count()+1).zfill(3)
print("user ref count: " + user_ref_count)
reference_id = last_name_tres + first_name_tres + user_ref_co

Проблема с этим методом в том, что если, например, есть 2 пользователя, т.е. MDVTAS001 и MDVTAS002, и я удаляю MDVTAS001, то счетчик равен 1, и следующий подходящий пользователь получит MDVTAS002, но он уже существует, и так как я устанавливаю уникальность этого значения, это приведет к неудаче. Теперь, если есть 5 пользователей и 2 удалены, проблема усугубляется еще больше.

Как сделать так, чтобы все значения всегда увеличивались, даже если пользователи были удалены?

last_record = ProfileMember.objects.filter(reference_id__startswith=(last_name_tres + first_name_tres)).order_by('reference_id').last()
if last_record:
    reference_id = last_name_tres + first_name_tres + str(int(last_record.reference_id[-3:]) + 1).zfill(3)
else:
    reference_id = last_name_tres + first_name_tres + '001'
Вернуться на верх