I can't understand why my m2m_changed signal is not triggered.
Here is the code:
models.py
class Badge(TimeStampable, Expirable, Deactivable,
SafeDeleteModel):
_safedelete_policy = HARD_DELETE
owner = models.ForeignKey(settings.AUTH_USER_MODEL,
blank=True, null=True,
on_delete=models.PROTECT)
restaurants = models.ManyToManyField(Restaurant)
identifier = models.CharField(max_length=2048)
objects = SafeDeleteManager.from_queryset(BadgeQuerySet)()
signals.py
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
from .models import Badge
@receiver(m2m_changed, sender=Badge.restaurants.through)
def my_callback(sender, **kwargs):
print("M2M has been changed!")
apps.py (this post advised to change this file)
from django.apps import AppConfig
class BadgesConfig(AppConfig):
name = 'badges'
def ready(self):
import badges.signals
When going to a shell:
m2m_changed.receivers
returns an empty list (it does not work, and the signal can never be received)
I found similar post but did not found the answer in it.
Why m2m_changed signal does not work?
EDIT
When opening a shell and importing badges.signals
, it works.
It means the problem is in apps.py:
In [1]: from django.db.models.signals import m2m_changed
In [2]: m2m_changed.receivers
Out[2]: []
In [3]: import badges.signals
In [4]: m2m_changed.receivers
Out[4]:
[((4551224720, 4520068792),
<weakref at 0x10f4da5e8; to 'function' at 0x10f462d90 (check_uniqueness)>)]
from django.db.models.signals import m2m_changed
and post (in your question) what this gives you:m2m_changed.receivers
(if it isn't an empty list, in which case the signal was not connected). – Anabasm2m_changed.connect(my_callback)
to the end of signals.py and checkm2m_changed.receivers
again. (Might have to remove the receiver decorator from your callback). – Anabasbadges.signals
in your app's__init__.py
as mentioned here: click. (Either the init.py in the folder with settings.py or your app's main folder should work) – Anabasm2m_changed
in the shell? – Gnathicbadge_obj.restaurants.add(rest_obj)
or similar? – Gnathic@receiver(m2m_changed, sender=Badge.restaurants.through, weak=False)
? – Pascal__init__.py
in this django app? – Dariodarioleweak=False
but nothing changed. @SardorbekImomaliev__init__.py
is empty, but that's expected because I useapps.py
to register the signal, as advised in documentation. (I already tried with the init method and did not work) – Maui