如何在保存时将整数添加到 Django 模型中的主键字段
How to add integers to primary key field in Django Model at save
在我的 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.
根据这里的回答:
使用 @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)
您可以在调用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)
在我的 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.
根据这里的回答:
使用 @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)
您可以在调用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)