[Django] #32515: m2m_changed signal not received with custom through model

28 views
Skip to first unread message

Django

unread,
Mar 6, 2021, 10:30:13 AM3/6/21
to django-...@googlegroups.com
#32515: m2m_changed signal not received with custom through model
-------------------------------------+-------------------------------------
Reporter: leon | Owner: nobody
hughes |
Type: Bug | Status: new
Component: Database | Version: 2.2
layer (models, ORM) | Keywords: m2m_changed,
Severity: Normal | signals
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
Consider the following models:

{{{
class Game(models.Model):

participants = models.ManyToManyField(
to='card_users.UserProfile',
related_name='card_games',
through='cardgame.GameThroughModel',
)


class GameThroughModel(models.Model):

game = models.ForeignKey(
to='card_game.Game',
on_delete=models.CASCADE,
)
participant = models.ForeignKey(
to='card_users.UserProfile',
on_delete=models.CASCADE,
)


class UserProfile(models.Model):
user = models.OneToOneField(
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='profile',
)
}}}

I have a receiver set up to perform further actions when new participants
are added using m2m_changed:

{{{
@receiver(m2m_changed, sender=Game.participants.through,
dispatch_uid='create_initial_round', weak=False)
def create_initial_round(sender, instance, action, **kwargs):
print(f"{sender}, {instance}, {action}")
}}}

The m2m_changed signal is not received. When a standard manytomany model
relation is used ie.:
{{{
class Game(models.Model):

participants = models.ManyToManyField(
to='card_users.UserProfile',
related_name='card_games',
)
}}}
the signal is received correctly.

--
Ticket URL: <https://code.djangoproject.com/ticket/32515>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Mar 6, 2021, 10:31:14 AM3/6/21
to django-...@googlegroups.com
#32515: m2m_changed signal not received with custom through model
-------------------------------------+-------------------------------------
Reporter: leon hughes | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 2.2
(models, ORM) |
Severity: Normal | Resolution:
Keywords: m2m_changed, | Triage Stage:
signal, custom model, | Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by leon hughes):

* keywords: m2m_changed, signals => m2m_changed, signal, custom model,


--
Ticket URL: <https://code.djangoproject.com/ticket/32515#comment:1>

Django

unread,
Mar 6, 2021, 10:31:40 AM3/6/21
to django-...@googlegroups.com
#32515: m2m_changed signal not received with custom through model
-------------------------------------+-------------------------------------
Reporter: leon hughes | Owner: nobody
Type: Bug | Status: new

Component: Database layer | Version: 2.2
(models, ORM) |
Severity: Normal | Resolution:
Keywords: m2m_changed, | Triage Stage:
signal, custom model, | Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by leon hughes):

keyword changes

--
Ticket URL: <https://code.djangoproject.com/ticket/32515#comment:2>

Django

unread,
Mar 6, 2021, 3:08:18 PM3/6/21
to django-...@googlegroups.com
#32515: m2m_changed signal not received with custom through model
-------------------------------------+-------------------------------------
Reporter: leon hughes | Owner: nobody
Type: Bug | Status: closed

Component: Database layer | Version: 2.2
(models, ORM) |
Severity: Normal | Resolution: invalid

Keywords: m2m_changed, | Triage Stage:
signal, custom model, | Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Mariusz Felisiak):

* status: new => closed
* resolution: => invalid


Comment:

The `m2m_changed` signal was created for automatically created
intermediate models. If you have an explicit `through` model, you can
attached `Model` signals to it, i.e. `pre_save`, `post_save`,
`pre_delete`, and `post_delete`.

--
Ticket URL: <https://code.djangoproject.com/ticket/32515#comment:3>

Reply all
Reply to author
Forward
0 new messages