Префикс и длина первичного ключа Django

#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;