Автоматическое увеличение номера счета-фактуры в бэкэнде django для нового счета-фактуры

Я хочу автоматически увеличить номер счета, который составляет 3 цифры и 4 цифры.

class Invoice: invoice_no = models.CharField(max_length=500, null=True, blank=True, validators=[RegexValidator(regex='^[a-zA-Z0-9]*$',message='Invoice must be Alphanumeric',code='invalid_invoice number'),]) 

Я регистрирую эту модель в бэкэнд. Но теперь, когда я нажимаю на создание счета в админ, счет должен быть заполнен автоматически. Когда я снова нажимаю на создание нового счета в admin, номер invoice_number должен быть увеличен на единицу и должен быть автоматическим.

Ex для номера счета MAG0001, MAG0002, MAG0003 и т. Д., И это должно быть автоматическое поле в admin, когда я нажимаю на создание нового счета-фактуры.

    4 Solutions collect form web for “Автоматическое увеличение номера счета-фактуры в бэкэнде django для нового счета-фактуры”

    Определите функцию для создания номера счета-фактуры.

     def increment_invoice_number(): last_invoice = Invoice.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) 

    Это всего лишь идея. Измените функцию в соответствии с вашим предпочтительным номером номера счета.

     def invoiceIncrement(): get_last_invoice_number incremente_last_invoice_number return next_invoice_number class Invoice: invoice_no = models.CharField(max_length=500, null=True, blank=True, validators=[RegexValidator(regex='^[a-zA-Z0-9]*$', message='Invoice must be Alphanumeric',code='invalid_invoice number'),], default=invoiceIncrement) 

    Попробуйте следующее: есть некоторые очевидные проблемы:

    1. если одновременно несколько экземпляров добавит счет-фактуру, может возникнуть столкновение

    2. вам нужно будет сделать дополнительный вызов db каждый раз, когда вы создадите новый счет-фактуру.

    Также: вы можете просто рассмотреть возможность использования либо auto_increment, либо UUID.

    Может быть, этот код может помочь

     def increment_invoice_number(): last_invoice = Invoice.objects.all().order_by('id').last() if not last_invoice: return 'MAG0001' invoice_no = last_invoice.invoice_no new_invoice_no = str(int(invoice_no[4:]) + 1) new_invoice_no = invoice_no[0:-(len(new_invoice_no))] + new_invoice_no return new_invoice_no 

    В приведенном выше ответе arulmr просто отредактируйте поле char

     def increment_invoice_number(): last_invoice = Invoice.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]) width = 4 new_invoice_int = invoice_int + 1 formatted = (width - len(str(new_invoice_int))) * "0" + str(new_invoice_int) new_invoice_no = 'MAG' + str(formatted) return new_invoice_no class Invoice(models.Model): invoice_no = models.CharField(max_length = 500, default = increment_invoice_number, null = True, blank = True) 

    Это будет работать нормально.

    Python - лучший язык программирования в мире.