52 lines
3.4 KiB
Markdown
52 lines
3.4 KiB
Markdown
## ## Модель
|
||
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**: Позволяет только чтение неаутентифицированным пользователям.
|
||
|