为新发票自动增加 django 后端的发票编号

Posted

技术标签:

【中文标题】为新发票自动增加 django 后端的发票编号【英文标题】:Auto increament the invoice number in django backend for new invoice 【发布时间】:2015-03-27 17:51:51 【问题描述】:

我想自动增加发票号码,即 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 应该加一并且应该是自动字段。

例如发票编号 MAG0001、MAG0002、MAG0003 等,当我点击创建新发票时,这应该是管理员中的自动字段。

【问题讨论】:

我没有搜索它,但什么也没找到。 不要粗鲁,我不能代表所有人,但是 Stack Overflow 的许多贡献者更愿意帮助那些为解决手头问题付出了一些努力的人。我最好的建议是先尝试自己解决问题,如果仍有问题,请在此处提问。 好的,我正在努力。感谢您的建议 【参考方案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
    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)

这只是一个想法。修改函数以匹配您首选的发票编号格式。

【讨论】:

我需要把这个函数放在哪里?在视图或模型中? 出现错误 ImportError: cannot import name Invoice 该函数必须在您的模型类之上,或者包含在顶部的 model.py 文件中。另请注意我的回答,因为这个问题与我的问题相同。 如果它的上面的模型类那么它不能识别 last_invoice = Invoice.objects.all().order_by('id').last() 这一行中的 Invoice 类。有什么办法解决这个问题? 不知道如何解决这个问题...为什么不将最后一个发票 ID 保存在另一个表/模型中并从那里获取它,但是会添加另一个调用/保存到 db。【参考方案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)

试试这个:有一些明显的问题:

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

    每次创建新发票时都需要进行额外的数据库调用。

另外:您可能只想考虑使用 auto_increment 或 UUID。

【讨论】:

不得不删除default=invoiceIncrement上的()【参考方案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)

这会很好用。

【讨论】:

【参考方案4】:

也许这段代码可以提供帮助

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

【讨论】:

【参考方案5】:
def invoice_number_gen():
   last_invoice = Invoice.objects.all().order_by('id').last()
   last_invoice_number = last_invoice.invoice_no
   #invoice number format is 'customer_name_short + number' eg: CS003 
   last_invoice_digits =int(last_invoice_number[2:]) 
   #comment: slicing CS003 to get the number 003 and converting to int.
   last_invoice_initials = last_invoice_number[:2]              
   new_invoice_digits = last_invoice_digits + 1
   new_invoice_number = last_invoice_initials + str(new_invoice_digits)
   return (new_invoice_number)

【讨论】:

以上是关于为新发票自动增加 django 后端的发票编号的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中为不同的客户生成自动发票编号

如何应用软件机器人实现发票验证自动化?

Mysql - 防止重复输入字段中的增量值

使用数据库触发器生成无间隙数字

惠普打印机411怎么打印a5电子发票呢

金蝶KIS旗舰版提示:所选账套无效,无法建立数据库连接