Ответ
Для создания 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-массив с продуктами.
Ответ 18+ 🔞
Да блядь, ну вот опять эти ваши APIшки на Django! Слушай, как будто без них жизнь кончилась, ага. Ладно, раз уж надо, щас объясню, как это делается, чтобы даже твой кот, сука, понял.
Так, для начала, чтобы не выглядеть полным дауном, ставим Django REST Framework (DRF). Без него нихуя не получится, это как суп без воды — одна сухая лапша в глаза.
Задача: Надо сделать эндпоинт /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
Всё, запомнил? is_active — это чтобы не показывать удалённое барахло. Умные люди так делают.
2. Сериализатор (serializers.py)
А вот это, блядь, магия DRF! Сериализатор берёт твои кривые данные из базы и делает из них красивый 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
Видишь? fields — это как раз те поля, которые мы хотим показывать. id сам добавится, он же у модели есть. Не забудь про many=True, когда список объектов сериализуешь, а то получишь ошибку и будешь потом чесать репу.
3. Представление (views.py)
Тут вся логика обработки запроса. View — это как официант в ресторане: принимает заказ (запрос), бежит на кухню (в базу), приносит блюдо (данные) и красиво подаёт (JSON).
# 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)
Декоратор @api_view(['GET']) говорит, что эта функция будет обрабатывать только GET-запросы. Если приползёт POST — получит пизды в виде ошибки 405. filter(is_active=True) — чтобы только живое показывать, а не весь хлам. many=True — это, повторяю, ВАЖНО, иначе сериализатор будет ждать один объект, а ты ему кучу сунешь.
4. Маршрутизация (urls.py)
Ну и куда же без роутинга! Без него твой эндпоинт будет как призрак — все о нём говорят, но никто не видит.
# myapp/urls.py
from django.urls import path
from .views import get_product_list
urlpatterns = [
path('products/', get_product_list),
]
Не забудь подключить этот файл урлов в корневой urls.py проекта, под префиксом api/, например, а то опять будешь искать, почему блядь 404.
Вот и всё, ёпта! Теперь, когда сделаешь GET-запрос на /api/products/, получишь JSON с продуктами. Красота, да и только! Главное — миграции не забудь сделать после модели, а то опять будешь орать, что база пустая.