Как сохранить объект модели в другой метод сохранения модели

У меня есть модель пользователя, которая имеет отношение один к одному с двумя другими моделями. вот мои модели:

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 и изменяя логику вашего условия. это должно работать просто отлично

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