Как я могу автоматически увеличивать и сокращать строку в текстовом поле?

В настоящее время я пытаюсь сделать приложение для управления проектами и мне нужно автоинкрементировать количество проектов и добавить сокращенную строку из отдела. Например, если Product Development добавляет проект на сайт, мне нужно показать в таблице следующее PD_1

Самый простой способ - передать функцию полю default и использовать ее для генерации инкрементного текстового значения:

def create_project_reference():
   projects = Project.objects.filter(# some filter)
   return f'PD_{projects.count()+1}'

class Project(models.Model):
   project_reference = models.CharField(..., 
      default=create_project_reference, 
      editable=False
   )

Проблема в том, что вызываемая по умолчанию функция не получает self от созданной модели, поэтому вы не можете создавать динамические фильтры. Альтернативой является переопределение функции save() вашей модели, и тогда вы сможете получить доступ к self, передать ее в вашу функцию и использовать ее информацию для установки ваших фильтров:

def create_project_reference(project):
   projects = Project.objects.filter(department=project.department)
   return f'PD_{projects.count()+1}'

class Project(models.Model):
    ...

    def save(self, *args, **kwargs):
        self.project_reference = create_project_reference(self)
        super(Project, self).save(*args, **kwargs)

Существуют ограничения на переопределение функции save(), поскольку она не работает с функцией bulk update() - но это должно быть нормально для значения, которое устанавливается один раз при создании объекта.

Вернуться на верх