This situation comes up, from time to time, when we need to get something to happen after a many-to-many field is changed. The novice will connect a post_save signal and scratch his head when it doesn't fire on the addition or removal of items in the ManyToManyField. We all learn that it takes a slightly more complicated signal, the m2m_changed signal, and its many actions, which tell us exactly what has changed in the particular field sending it (the signal comes from the field's through table, to be exact).
def response_change(self, request, obj):
response = super(MyAdmin, self).response_change(request, obj)
def response_add(self, request, obj, *args, **kwargs):
response = super(MyAdmin, self).response_add(request, obj, *args, **kwargs)
These get called when the admin interface is used to edit and create a new object, respectively. It happens after both the model instance itself and all of the many-to-many fields have been saved, which is exactly what we need. It works, but I wish I could find a better solution.