Как написать сигнал для изменения поля в модели после изменения другого поля из другой модели
У меня есть модель пользователя, который должен пройти через несколько задач, таких как заполнение информации, прохождение тестов и собеседований. Поэтому я добавил поле уровня прогресса, которое показывает статус пользователя на данный момент. вот моя модель:
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.