This commit is contained in:
2024-05-14 11:39:33 +03:00
commit 2762ac794a
26 changed files with 1506 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
## ## Модель
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**: Позволяет только чтение неаутентифицированным пользователям.