Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to deal on a self.model.MultipleObjectsReturned exception on CrontabSchedule? #841

Open
joachimesque opened this issue Feb 1, 2025 · 0 comments

Comments

@joachimesque
Copy link

Hi!
I’m running django-celery-beat 2.6.0 (the app is a Bookwyrm instance)

Following a server move for my app, I discovered that I have regular self.model.MultipleObjectsReturned exceptions when trying to access my CrontabSchedule

>>> CrontabSchedule.objects.all()
<QuerySet [<CrontabSchedule: 0 4 * * * (m/h/dM/MY/d) UTC>, <CrontabSchedule: 0 4 * * * (m/h/dM/MY/d) UTC>]>
>>> CrontabSchedule.objects.first().periodictask_set.all()
<PeriodicTaskQuerySet [<PeriodicTask: celery.backend_cleanup: 0 4 * * * (m/h/dM/MY/d) UTC>, <PeriodicTask: celery.backend_cleanup: 0 4 * * * (m/h/dM/MY/d) UTC>]>
>>> CrontabSchedule.objects.last().periodictask_set.all()
<PeriodicTaskQuerySet [<PeriodicTask: celery.backend_cleanup: 0 4 * * * (m/h/dM/MY/d) UTC>, <PeriodicTask: celery.backend_cleanup: 0 4 * * * (m/h/dM/MY/d) UTC>]>

If I try to delete it:

>>> CrontabSchedule.objects.last().delete()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.11/site-packages/django/db/models/base.py", line 1132, in delete
    return collector.delete()
           ^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/deletion.py", line 463, in delete
    signals.pre_delete.send(
  File "/usr/local/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 176, in send
    return [
           ^
  File "/usr/local/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 177, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django_celery_beat/models.py", line 394, in changed
    cls.update_changed()
  File "/usr/local/lib/python3.11/site-packages/django_celery_beat/models.py", line 398, in update_changed
    cls.objects.update_or_create(ident=1, defaults={'last_update': now()})
  File "/usr/local/lib/python3.11/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 949, in update_or_create
    obj, created = self.select_for_update().get_or_create(defaults, **kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 916, in get_or_create
    return self.get(**kwargs), False
           ^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 640, in get
    raise self.model.MultipleObjectsReturned(
django_celery_beat.models.PeriodicTasks.MultipleObjectsReturned: get() returned more than one PeriodicTasks -- it returned 2!

The same error is returned when I run >>> CrontabSchedule.objects.last().periodictask_set.last().delete().

>>> from django_celery_beat.models import PeriodicTask
>>> PeriodicTask.objects.all()
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 218, in __get__
    rel_obj = self.field.get_cached_value(instance)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/mixins.py", line 15, in get_cached_value
    return instance._state.fields_cache[cache_name]
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 'crontab'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 377, in __repr__
    return "<%s %r>" % (self.__class__.__name__, data)
                                                 ^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/base.py", line 588, in __repr__
    return "<%s: %s>" % (self.__class__.__name__, self)
                                                  ^^^^
  File "/usr/local/lib/python3.11/site-packages/django_celery_beat/models.py", line 625, in __str__
    if self.crontab:
       ^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 236, in __get__
    rel_obj = self.get_object(instance)
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 199, in get_object
    return qs.get(self.field.get_reverse_related_filter(instance))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 640, in get
    raise self.model.MultipleObjectsReturned(
django_celery_beat.models.CrontabSchedule.MultipleObjectsReturned: get() returned more than one CrontabSchedule -- it returned 2!
>>> PeriodicTask.objects.last()
<PeriodicTask: check-for-updates: chaque jour>
>>> PeriodicTask.objects.first()
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 218, in __get__
    rel_obj = self.field.get_cached_value(instance)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/mixins.py", line 15, in get_cached_value
    return instance._state.fields_cache[cache_name]
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 'crontab'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.11/site-packages/django/db/models/base.py", line 588, in __repr__
    return "<%s: %s>" % (self.__class__.__name__, self)
                                                  ^^^^
  File "/usr/local/lib/python3.11/site-packages/django_celery_beat/models.py", line 625, in __str__
    if self.crontab:
       ^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 236, in __get__
    rel_obj = self.get_object(instance)
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 199, in get_object
    return qs.get(self.field.get_reverse_related_filter(instance))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/db/models/query.py", line 640, in get
    raise self.model.MultipleObjectsReturned(
django_celery_beat.models.CrontabSchedule.MultipleObjectsReturned: get() returned more than one CrontabSchedule -- it returned 2!

How serious do you think this error is?
How would I go fixing it?

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant