Мы можем создать функцию, которая ищет ServiceRequest
, который начинается с первых двух цифр года, а затем ищет последнюю из этих записей.
Если такой записи нет, мы return f'{y2}0000'
(таким образом, мы "запускаем" новую последовательность), и если это так, мы анализируем ее до int
, затем увеличиваем ее и получаем последние четыре цифры для создания новой:
from django.utils.timezone import now
def number():
y2 = now().strftime('%y')
last_request = ServiceRequest.objects.filter(
request_number__startswith=y2
).order_by('-request_number').values_list('request_number', flat=True).first()
if last_request is None:
return f'{y2}0000'
else:
num = (int(last_request) + 1) % 10000
return f'{y2}{num:04d}'
В модели мы передаем default=number
, поэтому ссылка на функцию, а не результат из вызова функции. Кроме того, может быть полезно указать индекс базы данных и сделать поле уникальным (чтобы предотвратить создание двух записей с одинаковыми reference_number
в базе данных):
class ServiceRequest(models.Model):
CATEGORY_CHOICES = (
(None, ''),
('aircraft_repair', 'Aircraft Repair'),
('backshop', 'Backshop'),
('documentation', 'Documentation'),
('other', 'Other')
)
PRIORITY_CHOICES = (
(None, ''),
('1', '1-Critical (<24 hours)'),
('2', '2-Urgent (1-2 Days)'),
('3', '3-Standard (3 Days)'),
('4', '4-Low (5 Days)')
)
timestamp = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
request_number = models.CharField(
max_length=6,
<b>db_index=True</b>,
default=<b>number</b>,
<b>unique=True</b>
)
Возможно, четырех цифр, однако, недостаточно. Может быть более безопасно использовать, например, max_length=8
, чтобы разрешить 1 000 000 запросов в год. Тем более, что некоторые номера запросов, возможно, недействительны (и поэтому будут закрыты).