【问题标题】:how can each user get increment and unique id on same table in django每个用户如何在 django 的同一张表上获得增量和唯一 ID
【发布时间】:2021-02-25 16:54:46
【问题描述】:

每次我想添加发票时,我都希望有一个唯一的 invoice_id,它是一个增量编号 (+1),但问题是我有一个多用户应用程序,所以我收到此 invoice_id 已经存在的错误存在。我如何自定义 id 以便每个用户都可以在最新的同一用户之后拥有其 id。

class Company(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=64)

class Invoice(models.Model):
company = models.ForeignKey('Company', on_delete=models.CASCADE)
invoice_id = models.CharField(max_length=20, unique=True)
name = models.CharField(max_length=256)

【问题讨论】:

  • 澄清一下,这个数字应该是每个用户自动递增,而不是每张桌子,对吧?那么每个用户都有一个连续 id 的列表?
  • 是的,谢谢

标签: django django-models django-views django-forms django-templates


【解决方案1】:

在您的公司记录中添加 last_invoice 字段。然后通过添加一个生成新发票的功能让它为您完成工作:

class Company(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=64)
    last_invoice = models.CharField(max_length=20)

    def get_invoice(self):
        l_newNum = self.last_invoice + '1' #your number here 
        self.last_invoice = l_newNum
        self.save()
        return l_newNum

class Invoice(models.Model):
    company = models.ForeignKey('Company', on_delete=models.CASCADE)
    #you no longer need unique as it will create a mess between companies
    invoice_id = models.CharField(max_length=20)
    name = models.CharField(max_length=256)

    def save(self):
        self.invoice_id = self.company.get_invoice()
        super(Invoice,self).save()

您需要在这里和那里填写详细信息,但这应该适合您。理想情况下,我建议 get_invoice 实际上用于为公司自动创建 Invoice 条目,但这取决于您正在构建的具体案例。

【讨论】:

  • 请注意,如果同时保存 2 张发票,这可能会产生竞争条件!我建议调查一下:docs.djangoproject.com/en/3.1/ref/models/querysets/…
  • 如果您遇到困难,是的,但在大多数情况下,Web 服务器会为您同步调用。如果我们正在谈论一些非常繁重的工作,您确实需要一个完全不同的数据库设计,我认为这不适合问题的范围
  • 嗯,是的,但我只是想在其他人偶然发现这个问题时发表评论。你永远不知道人们会遇到什么
  • 不幸的是它没有显示任何东西,没有 invoice_id 没有错误!
  • 我发布的代码 sn-p 是一个插图,基于您提供的内容。您既不能将其视为直接替代品,也不能指望它开箱即用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2015-07-29
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多