🏠 Закрепляющее задание
Это не LMS-задание. Данное задание создано для самостоятельного закрепления материала практикума 8 и не является официальным домашним заданием курса. Официальные задания выдаются в LMS.
⚡ Задание
Создай ViewSet и маршруты для модели Review (отзыв на продукт): ModelViewSet + DefaultRouter. Добавь фильтрацию по product и rating. Протестируй через DRF Browsable API или Postman.
Задание: API для модели Review
Представь, что у тебя есть модель Review (отзыв на продукт) в том же проекте интернет-магазина. Твоя задача — реализовать полный CRUD API с фильтрацией.
Модель (уже существует)
# store/models.py
from django.db import models
class Review(models.Model):
product = models.ForeignKey('Product', on_delete=models.CASCADE, related_name='reviews')
rating = models.IntegerField() # 1-5
text = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return f"Review for {self.product.name}: {self.rating}/5"
Что нужно реализовать
- Сериализатор в
store/serializers.py:ReviewSerializerсfields='__all__', полеcreated_atвread_only_fields. - ViewSet в
store/views.py:ReviewViewSet(ModelViewSet)сquerysetиserializer_class. - Фильтрация: добавить
filter_backends = [DjangoFilterBackend]сfilterset_fields = ['product', 'rating']. - Маршрут в
store/urls.py: зарегистрироватьReviewViewSetс префиксомr'reviews'черезDefaultRouter.
Подготовка окружения
# 1. Создать и активировать виртуальное окружение
python -m venv venv
venv\Scripts\activate # Windows PowerShell
# source venv/bin/activate # Linux/macOS
# 2. Установить зависимости
pip install django djangorestframework django-filter
# 3. Создать проект (если нет)
django-admin startproject config .
python manage.py startapp store
# 4. Создать миграции и запустить сервер
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
Проверка через DRF Browsable API
- Запусти сервер:
python manage.py runserver - Открой в браузере:
http://localhost:8000/api/reviews/ - Должна открыться страница DRF Browsable API со списком отзывов
- Попробуй создать отзыв через форму в браузере
- Проверь фильтрацию:
http://localhost:8000/api/reviews/?rating=5
Проверка через Postman
# GET — список отзывов
GET http://localhost:8000/api/reviews/
# POST — создать отзыв
POST http://localhost:8000/api/reviews/
Content-Type: application/json
{
"product": 1,
"rating": 5,
"text": "Отличный товар!"
}
# GET — фильтрация по рейтингу
GET http://localhost:8000/api/reviews/?rating=5
# GET — фильтрация по продукту
GET http://localhost:8000/api/reviews/?product=1
# GET — деталь
GET http://localhost:8000/api/reviews/1/
# PUT — обновление
PUT http://localhost:8000/api/reviews/1/
Content-Type: application/json
{
"product": 1,
"rating": 4,
"text": "Хороший товар, но есть нюансы."
}
# DELETE — удаление
DELETE http://localhost:8000/api/reviews/1/
Проверка в VS Code
- Открой проект в VS Code
- Убедись, что интерпретатор Python указывает на виртуальное окружение (Ctrl+Shift+P → "Python: Select Interpreter")
- Поставь точку останова в методе
get_queryset()илиget_serializer_class() - Создай
.vscode/launch.json:{ "version": "0.2.0", "configurations": [ { "name": "Django", "type": "debugpy", "request": "launch", "program": "${workspaceFolder}/manage.py", "args": ["runserver"], "django": true } ] } - Запусти через F5 и открой браузер на
http://localhost:8000/api/reviews/
Ожидаемый результат
- Все CRUD-операции работают для
/api/reviews/и/api/reviews/{pk}/ - Фильтрация
?rating=5и?product=1возвращает правильные результаты - DRF Browsable API отображает фильтры в интерфейсе
- Поле
created_atнельзя передать при POST/PUT (read_only)
Связь с разделами урока
- ModelViewSet и DefaultRouter: Теория
- DjangoFilterBackend: Решение 9.1
- Типичные ошибки: Ошибки