Как написать сигнал для изменения поля в модели после изменения другого поля из другой модели

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

class User(AbstractUser):
    id = models.AutoField(primary_key=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    isPreRegistered = models.BooleanField(default=False)
    role = models.CharField(max_length=25, null=True, choices=USER_ROLE_CHOICES, default=USER_ROLE_CHOICES[0][0])
    role_id = models.CharField(max_length=10, default='applicant')
    username = models.CharField(unique=True, max_length=13)
    first_name = models.CharField(max_length=32, null=True, default=None)
    last_name = models.CharField(max_length=64, null=True, default=None)
    gender = models.CharField(max_length=10, null=True)
    personalInfo = models.OneToOneField(PersonalInfo, on_delete=models.CASCADE, null=True)
    contactInfo = models.OneToOneField(ContactInfo, on_delete=models.Case, null=True)
    eliteInfo = models.OneToOneField(EliteInfo, on_delete=models.CASCADE, null=True)
    progress_level = models.CharField(max_length=25, null=True, choices=USER_PROGRESS_LEVELS, default=USER_PROGRESS_LEVELS[0][0])

и есть несколько моделей, которые связаны с моделью пользователя с помощью отношения внешнего ключа. вот одна из моделей, которую я добавил для примера:

class PsychologicInfo(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    final_assessment = models.TextField(null=True, blank=True)
    is_approved = models.CharField(max_length=64, blank=True)
    is_interviewed = models.BooleanField(default=False)

Я хочу написать сигнал или метод сохранения, который делает что-то вроде этого: если поле is_interviewed было True, изменить этот progress_level на USER_ROLE_CHOICES[1][0]

Я понятия не имею, как это сделать, поэтому спасибо за советы

Вы можете переопределить метод .save() из PsychologicInfo

class PsychologicInfo:
    ...

    def save(self):
        super().save()
        if self.is_interviewed:
            self.user.role = USER_ROLE_CHOICES[1][0] # or enter value here
            self.user.save()

или вы можете использовать Django signals.

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