Здравствуйте, мне нужно создать номер счета-фактуры с автоматическим инкрементом
Мне нужно создать автоматически увеличивающийся номер счета, начиная с 000001 и далее по возрастающей, например 000001, 000002, 000003 и т.д. Сейчас у меня есть этот код, который я взял из другого вопроса stack overflow, но мне не нужна часть MAG
def increment_invoice_number(self):
last_invoice = Transaction.objects.all().order_by('id').last()
if not last_invoice:
return 'MAG0001'
invoice_no = last_invoice.invoice_no
invoice_int = int(invoice_no.split('MAG')[-1])
new_invoice_int = invoice_int + 1
new_invoice_no = 'MAG' + str(new_invoice_int)
return new_invoice_no
invoice_no = models.CharField(max_length=500, default=increment_invoice_number, null=True, blank=True)
я хочу, чтобы номер моего счета начинался с 000001
Вы можете использовать IntegerField
вместо CharField
для счетов-фактур:
from django.db.models import Max
def invoice_number():
invid = Invoice.objects.aggregate(
max_inv=Max('invoice_no')
)['max_inv']
if invid is not None:
return invid + 1
return 0
class Invoice(models.Model):
invoice_no = models.IntegerField(default=invoice_number, unique=True, editable=False)
Таким образом, мы определяем максимальное значение для invoice_no
, а затем назначаем его в качестве значения по умолчанию для invoice_no
нашей Invoice
модели.
unique=True
предотвратит наличие двух (или более) счетов-фактур с одинаковым invoice_no
. Если существует условие гонки, то одно из двух представлений выдаст ошибку. Таким образом, вы можете реализовать механизм повторных попыток, чтобы в конечном итоге присвоить действительный номер счета-фактуры.
Сделав его editable=False
, это не появится в ModelForm
s и ModelAdmin
s для модели Invoice
. Это можно опустить, если форма должна сделать поле редактируемым.