【问题标题】:Auto increment a value in Django with respect to the previous one相对于前一个值在 Django 中自动增加一个值
【发布时间】:2010-11-07 02:19:22
【问题描述】:

有没有办法相对于前一个字段自动增加一个字段......例如,如果前一个记录的值是 09-0001,那么下一个记录应该分配 09-0002 等等一个......想法?我正在考虑覆盖保存方法,但我不太确定

【问题讨论】:

    标签: django auto-increment


    【解决方案1】:

    在 SQL 中:

    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | code  | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
    +-------+------------------+------+-----+---------+----------------+
    

    在 Django 中:

    self.code = None
    self.number = top.number + 1
    self.save() # or super(Product, self).save()
    

    保存后,code 会自动增加。

    【讨论】:

      【解决方案2】:

      Django 不允许您在模型中拥有多个 AutoField,并且您已经拥有一个作为主键。因此,您必须覆盖 save 并且可能需要回头查看表格以找出要增加的内容。

      类似这样的:

      class Product(models.Model): 
         code = models.IntegerField()
         number = models.IntegerField()
         ...
      
         def get_serial_number(self): 
            "Get formatted value of serial number"
            return "%.2d-%.3d" % (self.code, self.product)
      
         def save(self): 
            "Get last value of Code and Number from database, and increment before save"
            top = Product.objects.order_by('-code','-number')[0]
            self.code = top.code + 1
            self.number = top.number + 1
            super(Product, self).save()
      
         # etc.
      

      请注意,如果您的保存方法中没有某种锁定,您可能会遇到并发问题(两个线程试图在代码和数字中存储相同的值)。

      【讨论】:

      • 解决并发问题可以使用top = Product.objects.select_for_update(nowait=True).order_by('-code','-number')[0]
      • 是的,使用select_for_update(),但首先要确保您的RDBMS 支持行锁定! (最近的 MySQL 和 Postgres 会这样做)。
      【解决方案3】:

      AutoField 是 Django 用于模型基类的“id”属性的字段类型,但您可以将其用于其他自动递增字段。

      我认为您不能像示例中那样进行任何格式设置,但一个好的方法是创建一个自定义字段类型来覆盖 save() 方法以执行所需的格式设置。

      【讨论】:

      • 我会看看我能不能做到这一点...我认为有一些更简单的方法,比如检索该字段的上一条记录的值,然后将其加 1。总之谢谢
      • 目前在 Django 中每个模型只允许一个 AutoField,它用于主字段。
      猜你喜欢
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多