## ## Модель 1. **TimeStampedModel:** - **created_at:** DateTimeField, автоматически устанавливает дату и время создания объекта. - **updated_at:** DateTimeField, автоматически обновляется при каждом сохранении объекта. - **author:** ForeignKey, связывает с моделью пользователя, который создал объект. ## Сериализатор 1. **ProfileSerializer**: - `username` (CharField): Никнейм пользователя. - `bio` (TextField): Биография пользователя. - `image` (URLField): URL-адрес аватара пользователя. - `following` (SerializerMethodField): Показывает, подписан ли текущий пользователь на пользователя, представленного данным профилем. - Метод `get_following`: Возвращает булево значение, указывающее, подписан ли текущий пользователь на пользователя профиля. 2. **TagSerializer**: - Сериализатор для добавления тегов. - Содержит единственное поле `tags`, которое является списком строк. ## Контроллер 1. **TagView**: - Представление для работы с тегами. - Использует `GenericViewSet` и `ListModelMixin` для обработки только GET-запросов. - Включает метод `list` для получения списка тегов. ``` class TagView(viewsets.GenericViewSet, mixins.ListModelMixin): queryset = Tag.objects.all() serializer_class = TagSerializer http_method_names = ['get',] ``` 2. Метод `favorite` с декоратором `@action` для добавления/удаления статьи из избранного. ``` @action(detail=True, methods=['post']) def favorite(self, request, id=None): article = self.get_object() if article.favorites.filter(id=request.user.id).exists(): article.favorites.remove(request.user) else: article.favorites.add(request.user) article.save() serializer = self.get_serializer(article) return Response(serializer.data) ``` ## Маршрутизатор - `DefaultRouter` из библиотеки `rest_framework.routers` автоматически создает маршруты для представлений на основе их названий и методов (например, GET, POST, PUT, DELETE). За вас обрабатывается большая часть создания URL-путей, что делает код более модульным и менее подверженным ошибкам. - **`register('tags', views.TagView)`**: Регистрация маршрута для представления `TagView` из `views.py` под именем 'tags'. ## Права доступа и разрешения 1. **IsAuthenticated**: Требует, чтобы пользователь был аутентифицирован для доступа к представлениям. 2. **IsAuthenticatedOrReadOnly**: Позволяет только чтение неаутентифицированным пользователям.