← Назад к вопросам
Расскажи про основные базовые классы, которые используешь в 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:
- Serializer — преобразование моделей
- APIView/ViewSet — обработка запросов
- Router — регистрация URL-ов
- Permission — контроль доступа
- Pagination — разбиение результатов
- Filter — фильтрация
- Authentication — аутентификация
- Throttle — ограничение запросов
DRF экономит сотни строк кода, автоматизируя всё, что можно автоматизировать.