Search code examples
djangodjango-modelsforeign-keysdjango-orm

Properly update Django model's foreign key property


I have a Django Model named EmailSendingTask. This is the whole model-

class EmailSendingTask(models.Model):
    order = models.OneToOneField(Order, on_delete=models.CASCADE, related_name='order')
    status = EnumChoiceField(SetupStatus, default=SetupStatus.active)
    time_interval = EnumChoiceField(TimeInterval, default=TimeInterval.five_mins)
    immediate_email = models.OneToOneField(PeriodicTask, on_delete=models.CASCADE, null=True, blank=True, related_name='immediate_email')
    scheduled_email = models.OneToOneField(PeriodicTask, on_delete=models.CASCADE, null=True, blank=True, related_name='scheduled_email')
    created_at = models.DateTimeField(auto_now_add=True)
    
    
    class Meta:
        verbose_name = 'EmailSendingTask'
        verbose_name_plural = 'EmailSendingTasks'
            
    
    def __str__(self) -> str:
        return f'EmailSendingTask: Order = {self.order}'

The immediate_email and scheduled_email fields are responsible for holding two PeriodicTask objects.

I have created a function called disable_scheduled_email, which is responsible for disabling the scheduled_email's periodic task. The detail of the function is here-

    def disable_scheduled_email(self):
        print(f'Disabling scheduled email...')
        self.scheduled_email.enabled = False
        self.save(update_fields=['scheduled_email'])

Now, whenever I call this function and print the value of the self.scheduled_email.enabled, I find it False. But, when I try to look at the Django Admin site, the periodic task's enabled value remains as True. Why is it happening?


Solution

  • After some experiments into the Django Shell I have found out that, I was not specifically calling save() to the foreign key (scheduled_email). I have just added self.scheduled_email.save() into the disable_scheduled_email function. So, the whole function became like:

        def disable_scheduled_email(self):
            print(f'Disabling scheduled email...')
            self.scheduled_email.enabled = False
            # self.save(update_fields=['scheduled_email'])
            self.scheduled_email.save() #instead of self.save(...), wrote this