#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. Огромное спасибо!