В моем приложении Django я создал модель с идентификатором (первичным ключом) в виде CharField длины 6. Я использую специальный валидатор, который позволяет пользователю вводить только целые числа. Есть ли способ добавить нули перед вводом, если его длина меньше "шести" символов, указанных в определении поля.

Например, пользователь вводит значение 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 .

2
shaan 29 Авг 2020 в 18:29

2 ответа

Лучший ответ

Вы можете использовать функцию zfill перед вызовом {{ X1}} и вызовите 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)
5
MehrdadEP 29 Авг 2020 в 19:56

Согласно этому ответу здесь: Django создает пользовательский идентификатор

С @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)
-1
Dimitar 29 Авг 2020 в 16:03