$ 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:

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。

文章轉自微信公眾號@攻城獅奶爸雜貨鋪

上一篇:

如何用Next.js構建API

下一篇:

E2E 測試中的 Mock API
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費