Теперь, когда вы достаточно подготовлены, пришло время закатать рукава и создать свой первый полноценный API. Это будет отличный шанс применить все знания, которые вы приобрели на предыдущих лекциях. Цели у нас такие:
- Научиться последовательно создавать API для модели данных.
- Выстроить процесс работы: от определения модели до тестирования API.
- Применить знания о Serializer, APIView и маршрутизации.
- Освоить тестирование вашего API с помощью инструментов, таких как Postman или curl.
Постановка задачи
Мы создадим API для управления моделью "Статья" (Article). Функциональность API будет включать:
- Получение списка всех статей
GET. - Получение деталей одной статьи
GETс параметром ID. - Создание новой статьи
POST. - Обновление существующей статьи
PUT. - Удаление статьи
DELETE.
Определение модели "Статья"
Первым делом добавим модель в приложение blog. Если у вас ещё нет приложения blog, создайте его:
python manage.py startapp blog
Теперь добавим модель Article в файл models.py приложения blog:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=255) # Заголовок статьи
content = models.TextField() # Содержание статьи
created_at = models.DateTimeField(auto_now_add=True) # Дата создания
updated_at = models.DateTimeField(auto_now=True) # Дата обновления
def __str__(self):
return self.title
Далее, сделаем миграции для базы данных:
python manage.py makemigrations
python manage.py migrate
Создание сериализатора для модели
Сериализаторы в DRF помогают преобразовывать данные между форматом JSON и объектами Django-моделей. Для начала создадим файл serializers.py в приложении blog, если его еще нет.
Добавим код:
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__' # Включаем все поля модели
3. Создание представлений для API
Теперь мы создадим API для работы с моделью Article. Мы будем использовать APIView для большей гибкости. Откройте файл views.py в приложении blog и добавьте следующий код:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404
from .models import Article
from .serializers import ArticleSerializer
class ArticleListCreateAPIView(APIView):
"""
API для получения списка статей и создания новых статей.
"""
def get(self, request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
def post(self, request):
serializer = ArticleSerializer(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)
class ArticleDetailAPIView(APIView):
"""
API для получения, обновления и удаления конкретной статьи.
"""
def get(self, request, pk):
article = get_object_or_404(Article, pk=pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)
def put(self, request, pk):
article = get_object_or_404(Article, pk=pk)
serializer = ArticleSerializer(article, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
article = get_object_or_404(Article, pk=pk)
article.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
Настройка маршрутизации
Теперь подключим наши представления к маршрутам. Откройте файл urls.py в приложении blog (если файла нет, создайте его) и добавьте следующий код:
from django.urls import path
from .views import ArticleListCreateAPIView, ArticleDetailAPIView
urlpatterns = [
path('articles/', ArticleListCreateAPIView.as_view(), name='article-list-create'),
path('articles/<int:pk>/', ArticleDetailAPIView.as_view(), name='article-detail'),
]
Не забудьте подключить маршруты приложения blog к общим маршрутам проекта. Откройте urls.py в основном проекте и добавьте:
from django.urls import path, include
urlpatterns = [
path('api/', include('blog.urls')), # Подключаем маршруты приложения blog
]
Тестирование API
Теперь запустим сервер разработки и протестируем API. Запустите сервер:
python manage.py runserver
Тестирование через браузер
Откройте в браузере следующие URL:
GETсписок статей:http://127.0.0.1:8000/api/articles/POSTновая статья:http://127.0.0.1:8000/api/articles/GETдетали статьи:http://127.0.0.1:8000/api/articles/<id>/PUTобновление статьи:http://127.0.0.1:8000/api/articles/<id>/DELETEудаление статьи:http://127.0.0.1:8000/api/articles/<id>/
Тестирование через Postman
- Для
GETзапросов укажите URL и нажмите "Send". - Для
POSTзапросов отправьте JSON, например:{ "title": "Первая статья", "content": "Содержание первой статьи" } - Аналогично, для
PUTзапросов укажите обновляемые данные. - Для
DELETEзапросов просто отправьте запрос без тела.
Возможные ошибки и их решение
- Ошибка 404 при получении объекта: убедитесь, что вы используете правильный ID статьи.
- Ошибка 400 при создании статьи: проверьте валидность JSON-данных. Поля
titleиcontentявляются обязательными. - Ошибка 500: проверьте логи сервера для выявления проблемы. Возможно, вы забыли сделать миграции.
Идеи для улучшения
- Добавьте валидацию полей в сериализаторе, например, минимальную длину для
title. - Реализуйте отображение статей с пагинацией.
- Расширьте API, добавив поиск или фильтрацию по названию статей.
Теперь у вас есть базовое, но полностью рабочее API для работы с моделью "Статья". Мы только начали погружение в мощные возможности Django REST Framework, и впереди нас ждут ещё более интересные задачи.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ