Как я могу автоматически увеличивать и сокращать строку в текстовом поле?
В настоящее время я пытаюсь сделать приложение для управления проектами и мне нужно автоинкрементировать количество проектов и добавить сокращенную строку из отдела. Например, если 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()
- но это должно быть нормально для значения, которое устанавливается один раз при создании объекта.