Как создать API-эндпоинт в Django REST Framework

«Как создать API-эндпоинт в Django REST Framework» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для создания API-эндпоинтов в Django стандартным решением является использование Django REST Framework (DRF). Процесс включает три основных компонента: Serializer, View и URL.

Задача: Создать эндпоинт /api/products/ для получения списка продуктов из базы данных.

1. Модель (models.py) Сначала определим модель данных.

# myapp/models.py
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

2. Сериализатор (serializers.py) Сериализатор преобразует сложные типы данных, такие как queryset'ы Django, в нативные типы Python, которые затем легко рендерятся в JSON.

# myapp/serializers.py
from rest_framework import serializers
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price'] # Поля для вывода в API

3. Представление (views.py) View обрабатывает HTTP-запросы. Он извлекает данные с помощью ORM, использует сериализатор для их преобразования и возвращает Response.

# myapp/views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Product
from .serializers import ProductSerializer

@api_view(['GET'])
def get_product_list(request):
    # Получаем все активные продукты из БД
    products = Product.objects.filter(is_active=True)
    # Сериализуем queryset (many=True указывает, что это список объектов)
    serializer = ProductSerializer(products, many=True)
    return Response(serializer.data)

4. Маршрутизация (urls.py) Наконец, связываем URL-адрес с нашим представлением.

# myapp/urls.py
from django.urls import path
from .views import get_product_list

urlpatterns = [
    path('products/', get_product_list),
]

Теперь при GET-запросе на /api/products/ (с учетом корневого URL) API вернет JSON-массив с продуктами.