#python #python-3.x #django
#python #python-3.x #django
Вопрос:
Я хочу добавить пользовательский первичный ключ к своим моделям. Вот что у меня есть на данный момент.
ticket_id = models.CharField(max_length=10, primary_key=True, editable=False)
Я в основном хочу, чтобы первичный ключ для каждой записи выглядел так, автоматически увеличиваясь с 001.
AB001
AB002
AB003
AB004
Как бы я этого добился?
Большое спасибо
Комментарии:
1. То есть вы каждый раз хотите добавлять
AB
, или это какая-то часть ключа для генерации?
Ответ №1:
Вы могли бы переопределить метод сохранения, получить последнюю запись идентификатора в базе данных, извлечь числовую часть строки идентификатора и увеличить ее на единицу:
def save(*args, **kwargs):
if self.ticket_id is None:
last_ticket_id = self.__class__.objects.all().order_by('ticket_id').last()
if last_ticket_id is None:
last_ticket_id = '000'
last_ticket_id_number = ''.join(substr for substr in last_ticket_id if substr.isdigit())
leading_zeros = len(last_ticket_id_number) - 1
incremented_number = int(last_ticket_id_number) 1
incremented_number = str(incremented_number).zfill(leading_zeros)
self.ticket_id = f'AB{incremented_number}'
super().save(*args, **kwargs)
Комментарии:
1. Спасибо за ваш ответ, это сработало именно так, как я этого хотел. Мне просто нужно было добавить SELF к параметрам. Большое спасибо за вашу помощь!
Ответ №2:
Решение состоит в том, чтобы установить поле автоинкремента, например:
user_id = models.AutoField(primary_key=True)
После этого вы можете запустить эту команду на стороне базы данных. Вы можете запустить эту команду Python с помощью сигналов:
ALTER SEQUENCE user_id RESTART WITH 10000;