docs: def clone_fluent_contentitems_m2m_relationships(self, dst_obj):
          """
          Find all MTM relationships on related ContentItem's and ensure the
          published M2M relationships directed back to the draft (src)
          content items are maintained for the published (dst) page's content
          items.
          """
          if not hasattr(self, 'contentitem_set'):
              return
          # We must explicitly and reliably order both the src and dst content
          # items here to ensure that we are processing the same logical item for
          # the draft and published copies. The default `ContentItem` ordering of
          # ('placeholder', 'sort_order') is not sufficient because it relies on
          # the placeholder PK remaining static, whereas we clone placeholders to
          # the published copy and may sometimes clone them with PKs in a
          # different order.
          reliable_ordering = [
              # Group items by owning placeholder using slot name, not PK
              'placeholder__slot',
              # Order items correctly within the placeholder grouping
              'sort_order'
          ]
          for src_ci, dst_ci in zip(
              self.contentitem_set.order_by(*reliable_ordering),
              dst_obj.contentitem_set.order_by(*reliable_ordering)
          ):
              for field, __ in src_ci._meta.get_m2m_with_model():
                  field_name = field.name
                  src_m2m = getattr(src_ci, field_name)
                  dst_m2m = getattr(dst_ci, field_name)
  
                  # It is safe to just `add` here, rather than match src and
                  # dst listing exactly (i.e. potentially delete or re-order
                  # items) because the destination content items are
                  # re-created on publish thus always have empty M2M rels.
                  dst_m2m.add(*src_m2m.all())