Python 在django后端自动增加新发票的发票号

Python 在django后端自动增加新发票的发票号,python,django,django-admin,django-admin-filters,django-admin-tools,Python,Django,Django Admin,Django Admin Filters,Django Admin Tools,我想自动增加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'),]) 我在后端注册了这个模型。但是现在,当

我想自动增加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'),])
我在后端注册了这个模型。但是现在,当我在管理中单击CreateInvoice时,发票应该是自动填写的。当我再次在admin中单击create new invoice(创建新发票)时,发票号应该增加一,并且应该是自动字段

发票编号MAG0001、MAG0002、MAG0003等的Ex,当我单击“创建新发票”时,这应该是管理中的自动字段

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)
试试这个:有一些明显的问题:

  • 如果多人同时添加发票,则可能发生冲突

  • 每次创建新发票时,都需要进行额外的db调用

  • 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)
    

    同样:您可能只想考虑使用AutoYLUP或UUID.< /P> < P>定义一个函数来生成发票号。

    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答案中,只需编辑字符字段即可

    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)
    

    这将很好地工作。

    也许这段代码会有所帮助

    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
    

    我什么也没找,但什么也没找到。不客气,我也不能代表所有人说话,但Stack Overflow的许多贡献者更愿意帮助那些为解决手头的问题付出了一些努力的人。我最好的建议是先尝试自己解决这个问题,如果你仍然有问题,那么在这里问一个问题。好的,我一定会努力的。谢谢你的建议我需要把这个函数放在哪里?在视图或模型中?获取错误ImportError:无法导入名称发票该函数必须位于模型类的上方,或包含在顶部的model.py文件中。还请注意我的答案,因为这一答案与我的答案有相同的问题。如果其上面的模型类,则它无法识别此行中last_Invoice=Invoice.objects.all().order_by('id').last()中的Invoice类。解决这个问题的办法是什么?不知道如何解决这个问题。。。为什么不将最后一个发票ID保存在另一个表/模型中,并从那里获取它,则会向db添加另一个调用/保存。但是,必须删除
    default=invoiceIncrement