代码之家  ›  专栏  ›  技术社区  ›  Stephen

自动在Django中相对于上一个值递增一个值

  •  6
  • Stephen  · 技术社区  · 15 年前

    是否有一种方法可以自动增加与前一个字段相关的字段…例如,如果前一个记录的值为09-0001,那么下一个记录应该被分配为09-0002,因此一个…想法?我正在考虑重写save方法,但我不太确定

    3 回复  |  直到 12 年前
        1
  •  8
  •   Seth    15 年前

    Django不会让你在一个模型中有多个autofield,而且你已经有了一个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.
    

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

        2
  •  0
  •   pjbeardsley    15 年前

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

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

        3
  •  0
  •   rex    12 年前

    在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 将自动增加。