Как сохранить объект модели в другой метод сохранения модели
У меня есть модель пользователя, которая имеет отношение один к одному с двумя другими моделями. вот мои модели:
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)
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)
progress_level = models.CharField(max_length=25, null=True, choices=USER_PROGRESS_LEVELS)
class ScientificInfo(models.Model):
id = models.AutoField(primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
final_assessment = models.TextField(null=True, blank=True)
is_interviewed = models.BooleanField(default=False)
class PsychologicInfo(models.Model):
id = models.AutoField(primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
final_assessment = models.TextField(null=True, blank=True)
is_interviewed = models.BooleanField(default=False)
Я хочу обновлять уровень_прогресса пользователя, если PsychologicInfo.is_interviewed и ScientificInfo.is_interviewed оба True. Поэтому я решил переопределить метод сохранения и добавил это в модель пользователя:
def save(self, *args, **kwargs):
if self.scientificinfo.is_interviewed == True and self.psychologicinfo.is_interviewed == True:
self.progress_level = USER_PROGRESS_LEVELS[1][0]
return super(User, self).save(*args, **kwargs)
Но я должен сохранить объект User еще раз, чтобы увидеть некоторые результаты. как я могу обновить поле уровня прогресса, когда PsychologicInfo и ScientificInfo будут сохранены?
Я думаю, что вы можете использовать сигналы Django, пост_сохранение может быть тем, что вам нужно. Вы можете сделать проверку, если экземпляры PsychologicInfo или ScientificInfo обновлены или созданы, затем обновите прогресс
вот пример того, что вам может понадобиться:
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import PsychologicInfo, ScientificInfo
# import your choices USER_PROGRESS_LEVELS
@receiver(post_save, sender=PsychologicInfo)
def pre_save_receiver(sender, instance, *args, **kwargs):
if instance:
if instance.psychologicinfo.is_interviewed:
instance.progress_level = USER_PROGRESS_LEVELS[1][0]
# Do other operation ...
Вы дублируете этот код, изменяя sender и изменяя логику вашего условия. это должно работать просто отлично