from django.utils.html import mark_safe class ListRelatedMixin: """Provides a used_by column which can be found by defining related models in the following format: related_models = [ (<related_name>, <field_name>), ] e.g. This would be object.<related_name>_set.field """ def get_queryset(self, request): qs = super().get_queryset(request) related = [f'{form}_set__{field}' for form, field in self.related_models] return qs.prefetch_related(*related) def _list_related(self, obj, form, field): return ', '.join(getattr(obj, f'{form}_set').values_list(f'{field}__title', flat=True)) def used_by(self, obj): rows = list() for form, field in self.related_models: related = self._list_related(obj, form, field) if related: rows.append(related) return mark_safe('<br>'.join(rows))