diff --git a/django_celery_beat/schedulers.py b/django_celery_beat/schedulers.py index e73057ae..449312b0 100644 --- a/django_celery_beat/schedulers.py +++ b/django_celery_beat/schedulers.py @@ -175,9 +175,13 @@ def from_entry(cls, name, app=None, **entry): def _unpack_fields(cls, schedule, args=None, kwargs=None, relative=None, options=None, **entry): + entry_schedules = { + model_field: None for _, _, model_field in cls.model_schedules + } model_schedule, model_field = cls.to_model_schedule(schedule) + entry_schedules[model_field] = model_schedule entry.update( - {model_field: model_schedule}, + entry_schedules, args=dumps(args or []), kwargs=dumps(kwargs or {}), **cls._unpack_options(**options or {}) diff --git a/t/unit/test_schedulers.py b/t/unit/test_schedulers.py index 5eb4d41c..062184c9 100644 --- a/t/unit/test_schedulers.py +++ b/t/unit/test_schedulers.py @@ -109,6 +109,9 @@ def create_model(self, Model=PeriodicTask, **kwargs): def create_interval_schedule(self): return IntervalSchedule.objects.create(every=10, period=DAYS) + def create_crontab_schedule(self): + return CrontabSchedule.objects.create() + @pytest.mark.django_db() class test_ModelEntry(SchedulerCase): @@ -334,6 +337,16 @@ def test_periodic_task_model_disabled_schedule(self): assert 'celery.backend_cleanup' in sched assert self.entry_name not in sched + def test_periodic_task_model_schedule_type_change(self): + self.m1.interval = None + self.m1.crontab = self.create_crontab_schedule() + self.m1.save() + + self.Scheduler(app=self.app) + self.m1.refresh_from_db() + assert self.m1.interval + assert self.m1.crontab is None + @pytest.mark.django_db() class test_DatabaseScheduler(SchedulerCase):