code: def _create_tracked_event_m2m(model, instance, sender, objects, action):
      
      field = _get_m2m_field(model, sender)
      if field in getattr(model, '_tracked_related_fields', {}).keys():
          # In case of a m2m tracked on a related model
          related_fields = model._tracked_related_fields[field]
          for related_field in related_fields:
              try:
                  related_instances = getattr(instance, related_field[1])
              except ObjectDoesNotExist:
                  continue
              # FIXME: isinstance(related_instances, RelatedManager ?)
              if hasattr(related_instances, 'all'):
                  related_instances = related_instances.all()
              else:
                  related_instances = [related_instances]
              for related_instance in related_instances:
                  event = _create_event(related_instance, action)
                  fieldname = '{0}__{1}'.format(related_field[0], field)
                  _create_tracked_field_m2m(
                      event, instance, field, objects, action, fieldname
                  )
      if field in getattr(model, '_tracked_fields', []):
          event = _create_event(instance, action)
          _create_tracked_field_m2m(event, instance, field, objects, action)
docs: Create the ``TrackedEvent`` and it's related ``TrackedFieldModification``
      for a m2m modification.
      The first thing needed is to get the m2m field on the object being tracked.
      The current related objects are then taken (``old_value``).
      The new value is calculated in function of ``action`` (``new_value``).
      The ``TrackedFieldModification`` is created with the proper parameters.
  
      :param model: The model of the object being tracked.
      :param instance: The instance of the object being tracked.
      :param sender: The m2m through relationship instance.
      :param objects: The list of objects being added/removed.
      :param action: The action from the m2m_changed signal.