【问题标题】:How to add integers to primary key field in Django Model at save如何在保存时将整数添加到 Django 模型中的主键字段
【发布时间】:2020-08-29 15:29:42
【问题描述】:

在我的 Django 应用程序中,我创建了一个模型,其 id(主键)为长度为 6 的 CharField。我正在使用一个自定义验证器,它只允许用户输入整数。如果输入小于字段定义中指定的“六”字符长度,有没有办法在输入之前添加零。

例如,用户在主键字段中输入值 1234。现在我希望在保存时 pk 字段值应保存为 001234

我尝试在save 执行此操作,但正在创建两条记录,一条由用户输入,另一条添加了零。

这是否有可能实现我想要做的事情?

编辑

这就是我正在做的事情(虽然对我来说似乎相当低技术):

class Plant(models.Model):
    plant_id = models.CharField(primary_key=True,..,)
    plant_name = models.CharField(max_length=55, verbose_name="Plant/W.Area")

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if len(self.plant_id) == 4:
            ramp_up_obj_id = '00' + str(self.plant_id)
            self.plant_id = str(ramp_up_obj_id)
        super().save(*args, **kwargs)

保存的结果是(如上所述):对于输入的值1001,创建了两条记录。一个为 1001,另一个为 001001

【问题讨论】:

  • 您能在问题中包含您的代码吗?可能你已经接近你需要做的事情了——听起来应该是可能的——但你的代码中可能存在人们可以帮助你修复的错误。

标签: django django-models primary-key


【解决方案1】:

你可以在调用super().save方法之前使用zfill函数,并且只调用一次super().save()

class Plant(models.Model):
    plant_id = models.CharField(primary_key=True,..,)
    plant_name = models.CharField(max_length=55, verbose_name="Plant/W.Area")

    def save(self, *args, **kwargs):
        self.plant_id = str(self.plant_id).zfill(6)
        super().save(*args, **kwargs)

【讨论】:

    【解决方案2】:

    根据这里的答案:Django generate custom ID

    使用@property(我强烈建议你改用这个)

    @property
    def sid(self):
        return "%05d" % self.id
    

    CharField

    id = models.CharField(primary_key=True, editable=False, max_length=10)
    
    def save(self, **kwargs):
        if not self.id:
            max = Rate.objects.aggregate(id_max=Max('id'))['id_max'] + 1
            self.id= "{:05d}".format(max if max is not None else 1)
        super().save(*kwargs)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-01
      • 2019-01-19
      • 1970-01-01
      • 2011-06-11
      • 2013-07-14
      • 2015-01-29
      • 2018-05-25
      相关资源
      最近更新 更多