🏠 Закрепляющее задание

Это не 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"

Что нужно реализовать

  1. Сериализатор в store/serializers.py: ReviewSerializer с fields='__all__', поле created_at в read_only_fields.
  2. ViewSet в store/views.py: ReviewViewSet(ModelViewSet) с queryset и serializer_class.
  3. Фильтрация: добавить filter_backends = [DjangoFilterBackend] с filterset_fields = ['product', 'rating'].
  4. Маршрут в 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

  1. Запусти сервер: python manage.py runserver
  2. Открой в браузере: http://localhost:8000/api/reviews/
  3. Должна открыться страница DRF Browsable API со списком отзывов
  4. Попробуй создать отзыв через форму в браузере
  5. Проверь фильтрацию: 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

  1. Открой проект в VS Code
  2. Убедись, что интерпретатор Python указывает на виртуальное окружение (Ctrl+Shift+P → "Python: Select Interpreter")
  3. Поставь точку останова в методе get_queryset() или get_serializer_class()
  4. Создай .vscode/launch.json:
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Django",
                "type": "debugpy",
                "request": "launch",
                "program": "${workspaceFolder}/manage.py",
                "args": ["runserver"],
                "django": true
            }
        ]
    }
  5. Запусти через 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)

Связь с разделами урока

← К оглавлению урока    ← Ресурсы