Допустим у нас есть зарегистрированные пользователи и какая-то модель, например "Компании", которую пользователь может добавлять в избранное. Обычно такая задача решается путем создания третьей таблицы Favorite, являющейся связующим звеном, для реализации ManyToManyField связи между пользователем и  компанией Однако, если мы захотим в будущем добавлять в "избранное" другие модели, например "Заявки", то придется писать много лишнего кода. С помощью инструментов Django можно реализовать функционал добавления в "избранное" с возможностью расширения типов добавляемого контента. Django ContentType и GenericForeignKey - это мощные инструменты, которые позволяют создавать универсальные  и многополюсные модели в Django. ContentType - это модель, которая позволяет определять тип модели во время выполнения, а не во время  создания. Она сохраняет информацию о модели, включая ее приложение и имя, в базе данных и позволяет ссылаться на эту модель в других моделях, используя полиморфные отношения. GenericForeignKey - это свойство модели, которое позволяет создавать отношения между моделями, не зная точного типа связываемой модели на момент создания. Вместо того, чтобы ссылаться на связываемую модель напрямую, вы ссылаетесь на ContentType и ID модели, которую вы хотите связать. Для того чтобы использовать GenericForeignKey, вы должны определить два поля в вашей модели - поле ContentType и поле Object ID. Поле ContentType хранит тип связываемой модели, а поле Object ID хранит ID этой модели. Вы также должны определить GenericForeignKey свойство, указывающее на поля ContentType и Object ID. Добавляем универсальную модель Favorite. При необходимости в модели, которые будут добавляться пользователем в избранное, можно добавить поле favorites = GenericRelation('Favorite'). По обращению к полю favorites есть возможность получать все связанные объекты модели Favorite. Каждому Вью-сету контента, который можно добавлять в избранное, будем добавлять путь .../<id>/favorite/. Путь url только для авторизированных, принимает GET-запрос. В методе мы получаем объект контента, который пользователь хочет добавить/удалить из избранных. Если объект уже добавлен этим пользователем в избранное, то мы удаляем из избранных, если его еще нет в избранных, до добавляем в избранное. Для удобства масштабирования пишем класс ManageFavorite, в котором описываем метод favorite, добавляющий данный функционал. Добавляем этот класс ManageFavorite в родители Вью-класса контента, который хотим добавлять в избранное Например, мы хотим добавить Заявку с id=2 в избранное. GET-запрос api/applications/2/favorite/ status 201 Удалить Заявку с id=2 из избранного. GET-запрос api/applications/2/favorite/ status 200 В нашем классе ManageFavorite добавляем метод annotate_qs_is_favorite_field, который принимает queryset и добавляет к каждому объекту модели контента булево поле is_favorite, отражающее добавлял ли текущий юзер данный экземпляр контента в избранное. Во Вью-сете контента описываем метод get_queryset, в котором применяем данную аннотацию для queryset. В сериалайзер добавляем одноименное аннотированное поле только для чтения. Например, запрашиваем список Заявок. GET-запрос api/applications/ status 200 В нашем классе ManageFavorite добавляем метод favorites, который формирует путь .../favorites/. Путь url только для авторизированных, принимает GET-запрос. Фильтрует queryset контента, аннотированный полем is_favorite, выбираем только значения True. Например, запрашиваем список Заявок добавленных в избранное. GET-запрос api/applications/favorites/ status 200 В целом, использование ContentType и GenericForeignKey может помочь вам создавать более универсальные и гибкие модели в Django, позволяющие создавать многополюсные отношения и уменьшающие количество кода, который необходимо написать для работы с различными типами моделей.  Python разработчик