Skip to content

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

Open
@joachimesque

Description

@joachimesque

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions