здравствуйте, мне нужно создать номер счета с автоматическим увеличением

#python #django

Вопрос:

Мне нужно создать автоматически увеличивающийся номер счета-фактуры, начиная с 000001 и далее, например, 000001, 000002, 000003 и т. Д. Прямо сейчас у меня есть этот код, который я взял из другого вопроса о переполнении стека, но я не хочу, чтобы часть 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

Комментарии:

1. Почему invoice_no CharField здесь а, если оно содержит только число?

2. могу ли я изменить его на десятичное поле?

3. нет, IntegerField на случай, если это целое число.

Ответ №1:

Вы можете использовать IntegerField вместо a 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 модели. Вы можете опустить это, если форма должна сделать поле доступным для редактирования.

Комментарии:

1. Огромное спасибо!