2

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가 하나씩 증가해야하고 자동 필드 여야합니다.

예 (송장 번호 MAG0001, MAG0002, MAG0003 등) 예. 새 송장 생성을 클릭하면 admin의 자동 입력란이어야합니다.

+0

아무것도를 도울 수 있습니다. – Gaurav

+1

무례하지 말고 모두를 위해 말할 수는 없지만 스택 오버플로에 참여한 많은 사람들이 문제의 해결에 어느 정도 노력을 기울인 사람을 도울 의향이 있습니다. 최선의 조언은 문제를 먼저 해결하고 문제가 계속되는 경우 여기에서 질문하십시오. – Brandon

+0

좋습니다. 나는 그것을 시도하고 있습니다. 조언을 주셔서 감사합니다 – Gaurav

답변

3

송장 번호를 생성하는 함수를 정의하십시오.

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) 

이것은 하나의 아이디어 일뿐입니다. 원하는 송장 번호 형식에 맞게 기능을 수정하십시오. 위의 arulmr 응답에서

+0

어디에서이 기능을 넣어야합니까? 보기 또는 모델에서? – Gaurav

+0

오류가 발생했습니다. ImportError : 이름을 가져올 수 없습니다. 송장 – Gaurav

+0

이 함수는 모델 클래스 위에 있어야하며, 맨 위에있는 model.py 파일에 있어야합니다. 또한 내 대답은이 문제가 내 문제와 같습니다. –

2
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를 사용하는 것이 좋습니다.

+0

'default = invoiceIncrement'에'()'을 제거해야했습니다 –

0

은이 잘 작동합니다

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) 

문자 필드를 편집 할 수 있습니다.

1

어쩌면이 코드는 내가 그것을 검색하지만 아무것도 가지고하지 않았다

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