所有文章 > API开发 > 使用 Django 和 Django REST 框架构建 RESTful API:实现 CRUD 操作

使用 Django 和 Django REST 框架构建 RESTful API:实现 CRUD 操作

在当今的 Web 开发世界中,RESTful API 是大多数现代应用程序的核心。REST API 使不同的应用程序能够相互通信,从而实现跨系统的模块化开发和集成。Django 与 Django REST 框架 (DRF) 相结合,提供了一个强大的工具包,可用于快速高效地构建 API。在这篇博文中,我们将介绍如何使用 Django 和 DRF 创建 RESTful API,重点介绍如何实现基本的 CRUD(创建、读取、更新、删除)操作。

什么是 REST?

    REST(表述性状态转移)是一种架构风格,它定义了一组用于构建 Web 服务的约束和约定。RESTful API 使用 HTTP 方法(如 GET、POST、PUT 和 DELETE)对资源执行操作。这些操作与 CRUD 操作一致:

  • 创建:POST – 用于创建新资源。
  • 读取:GET – 用于检索资源或资源集合。
  • 更新:PUT/PATCH – 用于修改现有资源。
  • 删除:DELETE – 用于移除资源。

什么是 Django REST Framework (DRF)?

    Django REST Framework 是一个功能强大且灵活的工具包,用于在 Django 之上构建 Web API。它提供许多功能,例如序列化、身份验证、分页等,使构建强大且可扩展的 API 变得更加容易。

使用 DRF 构建 CRUD 操作的分步指南

步骤 1:设置您的 Django 项目

首先,创建一个 Django 项目并安装 Django REST Framework。

$ mkdir myapi
$ cd myapi
$ python -m venv env
$ source env/bin/activate # on Windows: env\Scripts\activate
$ pip install django djangorestframework
$ django-admin startproject myproject
$ cd myproject
$ python manage.py startapp myapp

接下来,更新您的 settings.py 以包含 rest_framework 和您刚刚创建的应用程序:

NSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # Add this
'myapp', # Your app
]

步骤2:创建模型

让我们为书籍创建一个简单的模型。在 myapp/models.py 中:

from django.db import models

class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
published_date = models.DateField()
isbn = models.CharField(max_length=13)

def __str__(self):
return self.title

定义模型后,进行迁移和迁移:

$ python manage.py makemigrations
$ python manage.py migrate

步骤 3:创建序列化器

DRF 中的序列化器允许将复杂数据类型(如查询集和模型实例)转换为本机 Python 数据类型,这些数据类型可以轻松呈现为 JSON 或其他内容类型。在 myapp/serializers.py 中为 Book 模型创建一个序列化器:

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'published_date', 'isbn']

步骤 4:为 CRUD 操作创建视图

现在,我们将创建视图来处理 CRUD 操作。DRF 提供了几个通用视图和视图集,可以轻松实现这些操作。在 myapp/views.py 中:

from rest_framework import generics
from .models import Book
from .serializers import BookSerializer

# Create and Read (List) Operations
class BookListCreateView(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer

# Retrieve, Update, and Delete Operations
class BookDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer

步骤 5:设置 URL 路由

最后,让我们连接 URL。在 myapp/urls.py 中:

from django.urls import path
from .views import BookListCreateView, BookDetailView

urlpatterns = [
path('books/', BookListCreateView.as_view(), name='book-list'),
path('books/<int:pk>/', BookDetailView.as_view(), name='book-detail'),
]

在 myproject/urls.py 中,包含应用程序的 URL:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')), # Include app URLs
]

步骤 6:测试您的 API

要测试您的 API,您可以使用 curl、Postman 或 DRF 提供的 Django-admin API 接口等工具。让我们看一些示例请求。

创建新书籍(POST 请求)

POST /api/books/
Content-Type: application/json

{
"title": "Django for APIs",
"author": "William S. Vincent",
"published_date": "2020-01-01",
"isbn": "9781735467207"
}

响应:

{
"id": 1,
"title": "Django for APIs",
"author": "William S. Vincent",
"published_date": "2020-01-01",
"isbn": "9781735467207"
}

获取所有书籍(GET 请求)

GET /api/books/

响应:

[
{
"id": 1,
"title": "Django for APIs",
"author": "William S. Vincent",
"published_date": "2020-01-01",
"isbn": "9781735467207"
}
]

更新书籍(PUT 请求)

PUT /api/books/1/
Content-Type: application/json

{
"title": "Django for APIs Updated",
"author": "William S. Vincent",
"published_date": "2020-01-01",
"isbn": "9781735467207"
}

响应:

{
"id": 1,
"title": "Django for APIs Updated",
"author": "William S. Vincent",
"published_date": "2020-01-01",
"isbn": "9781735467207"
}

删除书籍(DELETE 请求)

DELETE /api/books/1/

响应:204 无内容

    以下是使用 Django 和 Django REST Framework (DRF) 构建 RESTful API 时可以采用的一些其他演示和方法,每个演示和方法都重点介绍了实现 CRUD 操作的不同方法。

演示 1:使用 ViewSet 和 Routers 进行 CRUD 操作

DRF 提供 ViewSet 和 Routers,可简化 URL 路由和视图。我们可以使用 ViewSet 在一个类中定义所有操作,而不必为每个 CRUD 操作手动定义视图。

1.1 ViewSet 实现

在此演示中,我们将使用 ViewSet 为 Book 模型创建相同的 CRUD 操作。

首先,更新 views.py 以使用 ViewSets:

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer

1.2 路由器实现

我们可以使用 DRF 的 DefaultRouter,而不必手动编写 URL,它将自动为所有 CRUD 操作(列出、检索、创建、更新、删除)创建路由。

在 myapp/urls.py 中,使用路由器:

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

router = DefaultRouter()
router.register(r'books', BookViewSet) # Register the viewset

urlpatterns = [
path('', include(router.urls)), # Include router-generated URLs
]

此方法将自动创建以下 URL:

  • /books/ – 列出所有书籍或创建新书籍。
  • /books/<id>/ – 检索、更新或删除特定书籍。

1.3 测试 ViewSet CRUD 操作

您可以使用 Postman 或 curl 等工具测试这些 API:

创建新图书 (POST):

POST /books/
Content-Type: application/json

{
"title": "REST API Design",
"author": "Michael Stowe",
"published_date": "2016-07-18",
"isbn": "9781491924509"
}

检索所有图书 (GET):

GET /books/

更新图书 (PUT):

PUT /books/1/
Content-Type: application/json

{
"title": "REST API Design Updated",
"author": "Michael Stowe",
"published_date": "2016-07-18",
"isbn": "9781491924509"
}

删除图书 (DELETE):

DELETE /books/1/

演示 2:使用 DRF Mixins 自定义 API 响应

有时,您可能希望自定义视图或更好地控制特定 API 操作。在此演示中,我们将使用 DRF Mixins 手动处理 Book 模型的 CRUD 操作。

2.1 在视图中使用 Mixins

在 views.py 中,为每个操作使用特定的 mixins:

from rest_framework import generics, mixins
from .models import Book
from .serializers import BookSerializer

class BookListCreateView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer

def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)

class BookDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer

def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)

def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)

def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)

在这里,我们手动定义要包含哪些 mixin。这使我们能够更好地控制自定义各个操作的行为。

2.2 URL 配置

在 urls.py 中,您可以手动定义路由:

from django.urls import path
from .views import BookListCreateView, BookDetailView

urlpatterns = [
path('books/', BookListCreateView.as_view(), name='book-list-create'),
path('books/<int:pk>/', BookDetailView.as_view(), name='book-detail'),
]

2.3 使用 Mixins 测试 API

以与之前相同的方式测试操作。功能(POST、GET、PUT、DELETE)将保持不变,但使用 mixins 可让您轻松扩展或自定义操作。

演示 3:添加过滤、搜索和分页

为了增强您的 API,您可以将过滤、搜索和分页等功能与 DRF 的内置类集成。

3.1 使用 DjangoFilterBackend 进行过滤

首先,安装 django-filter:

$ pip install django-filter

然后,将其添加到 settings.py:

INSTALLED_APPS = [
...
'django_filters', # Add this line
]

在 views.py 中,实现过滤:

from rest_framework import viewsets, filters
from django_filters.rest_framework import DjangoFilterBackend
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_fields = ['author', 'published_date'] # Filter by these fields
search_fields = ['title', 'author'] # Search within these fields

3.2 分页结果

要实现分页,请在 settings.py 中配置它:

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10, # Return 10 items per page
}

这将在调用 GET /books/ 端点时自动对结果进行分页。

3.3 使用过滤、搜索和分页进行测试

按作者过滤 (GET):

GET /books/?author=Michael%20Stowe

按标题搜索 (GET):

GET /books/?search=Design

分页响应 (GET):

GET /books/?page=2

演示 4:添加自定义操作

您可以使用 DRF 提供的 @action 装饰器将自定义操作添加到您的 ViewSet。

4.1 添加自定义操作

在 views.py 中,向 BookViewSet 添加自定义操作:

from rest_framework.decorators import action
from rest_framework.response import Response

class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer

@action(detail=False, methods=['get'])
def recent_books(self, request):
recent_books = Book.objects.order_by('-published_date')[:5]
serializer = self.get_serializer(recent_books, many=True)
return Response(serializer.data)

4.2 自定义操作的 URL 配置

自定义操作将自动添加到路由器 URL。上述操作可通过以下方式访问:

GET /books/recent_books/

4.3 测试自定义操作

获取最近的书籍(GET):

GET /books/recent_books/

写在最后:

  1. 这些演示提供了使用 Django 和 Django REST Framework 构建 RESTful API 的更高级用例。通过使用 ViewSet、路由器、mixin 和自定义操作,您可以简化开发过程,同时仍保持灵活性和对 API 的控制。
  2. 添加过滤、搜索、分页和自定义操作等功能可以提高 API 的可用性,并为用户提供更强大的数据交互方式。
  3. 使用 Django 和 Django REST Framework 构建 RESTful API 简单而强大。按照上述步骤,您可以轻松地为您的模型实现 CRUD 操作。借助 DRF 内置的序列化、身份验证和路由工具,您可以快速构建强大的 API。在此基础上,您可以探索其他 DRF 功能,如权限、限制和过滤,以进一步增强您的 API。

文章转自微信公众号@攻城狮奶爸杂货铺

#你可能也喜欢这些API文章!