← Назад к вопросам

Расскажи про основные базовые классы, которые используешь в Django REST framework

1.8 Middle🔥 181 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Django REST Framework: основные базовые классы

DRF (Django REST Framework) — это библиотека для создания REST API на Django. Она предоставляет готовые классы для 80% типичного кода. Расскажу о самых важных.

1. Serializers — преобразование моделей в JSON

Serializer — это класс, который преобразует модели Django в JSON и наоборот.

Базовый Serializer:

from rest_framework import serializers
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price', 'created_at']

С валидацией:

class ProductSerializer(serializers.ModelSerializer):
    # Дополнительное поле
    discount_price = serializers.SerializerMethodField()
    
    class Meta:
        model = Product
        fields = ['id', 'name', 'price', 'discount_price']
    
    def get_discount_price(self, obj):
        return obj.price * 0.9
    
    def validate_price(self, value):
        if value <= 0:
            raise serializers.ValidationError('Цена должна быть > 0')
        return value

Сериализация (модель → JSON):

product = Product.objects.get(id=1)
serializer = ProductSerializer(product)
print(serializer.data)  # {'id': 1, 'name': 'Product', 'price': 100.0}

# Много объектов
products = Product.objects.all()
serializer = ProductSerializer(products, many=True)

Десериализация (JSON → модель):

data = {'name': 'New Product', 'price': 50.0}
serializer = ProductSerializer(data=data)

if serializer.is_valid():
    serializer.save()  # Сохранит в БД
else:
    print(serializer.errors)  # {'price': ['Обязательное поле']}

2. Views — обработчики запросов

Вью — это класс, который обрабатывает HTTP запросы.

APIView — базовый класс

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class ProductListView(APIView):
    def get(self, request):
        """GET /products/"""
        products = Product.objects.all()
        serializer = ProductSerializer(products, many=True)
        return Response(serializer.data)
    
    def post(self, request):
        """POST /products/"""
        serializer = ProductSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

ViewSet — автоматический CRUD

from rest_framework.viewsets import ModelViewSet

class ProductViewSet(ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    
    # Автоматически создаёт:
    # GET /products/ — list
    # POST /products/ — create
    # GET /products/1/ — retrieve
    # PUT /products/1/ — update
    # DELETE /products/1/ — destroy

GenericAPIView — мотня для списков и деталей

from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView

class ProductListCreateView(ListCreateAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    # Автоматически: GET (list), POST (create)

class ProductDetailView(RetrieveUpdateDestroyAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    lookup_field = 'id'
    # Автоматически: GET (retrieve), PUT (update), DELETE (destroy)

3. Routers — автоматическая регистрация URL-ов

Router генерирует URL-ы для ViewSet-ов:

from rest_framework.routers import SimpleRouter, DefaultRouter
from django.urls import path, include
from .views import ProductViewSet

# SimpleRouter — минимум
router = SimpleRouter()
router.register(r'products', ProductViewSet)

urlpatterns = [
    path('api/v1/', include(router.urls)),
]

# Результат:
# GET    /api/v1/products/
# POST   /api/v1/products/
# GET    /api/v1/products/1/
# PUT    /api/v1/products/1/
# DELETE /api/v1/products/1/

# DefaultRouter добавляет API root
router = DefaultRouter()
# GET /api/v1/ — показывает все endpoints

4. Permissions — контроль доступа

Permission классы проверяют прав пользователя:

from rest_framework.permissions import IsAuthenticated, IsAdminUser, BasePermission

class IsOwner(BasePermission):
    """Только владелец может редактировать"""
    def has_object_permission(self, request, view, obj):
        return obj.owner == request.user

class ProductViewSet(ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAuthenticated, IsOwner]
    # Требует авторизации и проверяет владельца

5. Pagination — разбиение результатов

from rest_framework.pagination import PageNumberPagination

class ProductPagination(PageNumberPagination):
    page_size = 10  # 10 элементов на странице
    page_size_query_param = 'page_size'
    page_size_max = 100

class ProductViewSet(ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    pagination_class = ProductPagination

# GET /api/v1/products/?page=2&page_size=20

6. Filtering — фильтрация данных

from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend

class ProductViewSet(ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_fields = ['category', 'in_stock']
    search_fields = ['name', 'description']
    ordering_fields = ['price', 'created_at']
    ordering = ['-created_at']

# GET /api/v1/products/?category=electronics&search=laptop&ordering=price

7. Authentication — аутентификация

from rest_framework.authentication import TokenAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated

class ProductViewSet(ModelViewSet):
    authentication_classes = [TokenAuthentication, BasicAuthentication]
    permission_classes = [IsAuthenticated]

Token Authentication:

# settings.py
INSTALLED_APPS = [
    'rest_framework',
    'rest_framework.authtoken',
]

# Получить токен
from rest_framework.authtoken.models import Token
user = User.objects.get(username='alice')
token = Token.objects.get(user=user)
print(token.key)  # 'abc123def456...'

# Использовать в запросе
import requests
headers = {'Authorization': 'Token abc123def456...'}
response = requests.get('https://api.example.com/products/', headers=headers)

8. Throttling — ограничение запросов

from rest_framework.throttling import UserRateThrottle, AnonRateThrottle

class UserThrottle(UserRateThrottle):
    scope = 'user'
    THROTTLE_RATES = {'user': '100/hour'}

class AnonThrottle(AnonRateThrottle):
    scope = 'anon'
    THROTTLE_RATES = {'anon': '10/hour'}

class ProductViewSet(ModelViewSet):
    throttle_classes = [UserThrottle, AnonThrottle]

9. Renderers и Parsers — форматы данных

from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser

class ProductViewSet(ModelViewSet):
    # Какие форматы возвращать
    renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    
    # Какие форматы парсить
    parser_classes = [JSONParser, FormParser, MultiPartParser]

10. Status Codes — HTTP коды

from rest_framework import status

# Успешные
status.HTTP_200_OK
status.HTTP_201_CREATED
status.HTTP_204_NO_CONTENT

# Клиентские ошибки
status.HTTP_400_BAD_REQUEST
status.HTTP_401_UNAUTHORIZED
status.HTTP_403_FORBIDDEN
status.HTTP_404_NOT_FOUND

# Серверные ошибки
status.HTTP_500_INTERNAL_SERVER_ERROR

Типичная архитектура

# models.py
class Product(models.Model):
    name = models.CharField()
    price = models.DecimalField()

# serializers.py
class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price']

# views.py
class ProductViewSet(ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [IsAuthenticated]
    pagination_class = PageNumberPagination

# urls.py
router = DefaultRouter()
router.register('products', ProductViewSet)
urlpatterns = [path('api/v1/', include(router.urls))]

Выводы

Главные классы DRF:

  1. Serializer — преобразование моделей
  2. APIView/ViewSet — обработка запросов
  3. Router — регистрация URL-ов
  4. Permission — контроль доступа
  5. Pagination — разбиение результатов
  6. Filter — фильтрация
  7. Authentication — аутентификация
  8. Throttle — ограничение запросов

DRF экономит сотни строк кода, автоматизируя всё, что можно автоматизировать.

Расскажи про основные базовые классы, которые используешь в Django REST framework | PrepBro