【问题标题】:How to set integer field default to max number +1?如何将整数字段默认设置为最大数+1?
【发布时间】:2016-05-29 15:23:03
【问题描述】:

我曾经像这样设置整数字段的默认值。但是随着迁移,它不再起作用了。正确的做法是什么?

class Rechnung(models.Model):
  nummer = models.IntegerField(default=lambda: Rechnung.objects.latest('id').nummer + 1)
  [...]

【问题讨论】:

    标签: django django-models django-1.9


    【解决方案1】:

    您可以在模型保存方法中获取此值。保存创建和更新的运行,所以检查它是一个新对象,如果它是新的,则设置默认值:

    class Rechnung(models.Model):
      nummer = models.IntegerField()
    
      def save(self,*args,**kwargs):
            if self.id != None:
               # new record
               self.nummer = Rechnung.objects.latest('id').nummer + 1)
               super(Rechnung,self).save(*args,**kwargs)
    

    另一种方法是用自定义函数替换 lambda:

    def new_num():
       return Rechnung.objects.latest('id').nummer + 1)
    
    class Rechnung(models.Model):
          nummer = models.IntegerField(default=new_num)
    

    请注意,您将 callable 作为默认值提供,因此 django 每次需要默认值时都会调用它(就像之前版本中的 lambda)

    【讨论】:

    • 感谢您的回复,但我需要在管理员中获取它作为默认值,以验证它是否正确。
    • 已更新为默认值,只需将 lambda 替换为函数
    • 实际上我只是在文档中找到提示后尝试这样做,但现在我正在努力在它自己的定义中查询“Rechnung”:/
    • 它不是类的一部分,更像是一个静态方法。这是一个可调用的,django 在需要默认值时调用。标准查询集。您可以像在代码中的任何其他位置一样调用它。就像 lambda - 函数一样。
    • 我不认为自定义功能是保存。通过管理员中的并发访问,它可能会创建多个具有相同 nummer 值的条目。在任何情况下,您都应该将unique=True 添加到字段定义中以保存,并且还因为您可能会通过此字段查找实例(唯一创建索引)。
    猜你喜欢
    • 2016-12-03
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2011-11-18
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多