6

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'),])

このモデルをバックエンドに登録します。しかし、管理者で請求書の作成をクリックすると、請求書が自動入力されるはずです。管理者で新しい請求書の作成をもう一度クリックすると、invoice_number が 1 ずつ増加し、自動フィールドになるはずです。

たとえば、請求書番号 MAG0001、MAG0002、MAG0003 など。これは、新しい請求書の作成をクリックすると、管理者の自動フィールドになります。

4

5 に答える 5

15

請求書番号を生成する関数を定義します。

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)

これは単なるアイデアです。希望する請求書番号の形式に合わせて関数を変更します。

于 2015-01-28T18:10:53.737 に答える
3

上記の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)

これはうまくいきます。

于 2015-01-29T04:54:23.597 に答える
3
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 の使用を検討することもできます。

于 2015-01-28T17:56:42.127 に答える
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
于 2015-12-26T09:54:31.973 に答える