$ cd myapi
$ python -m venv env
$ source env/bin/activate

# on Windows: envScriptsactivate
$ 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//', 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 viewseturlpatterns = [
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//', 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。

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

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
返回頂部
上一篇
如何將cURL轉換為Python以發出REST API請求
下一篇
Deno 1.40 發布:Temporal API、簡化導入與開發者工具全面升級指南(2025)
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
91老师片黄在线观看| 亚洲综合激情另类小说区| 2021国产精品久久精品| 舔着乳尖日韩一区| 91精品在线一区二区| 久久精品国产免费看久久精品| 成人午夜激情影院| 五月天亚洲婷婷| 欧美zozo另类异族| 国产成人av一区二区三区在线| 国产亚洲欧洲一区高清在线观看| 国产麻豆9l精品三级站| 综合中文字幕亚洲| 欧美日韩精品一区二区天天拍小说| 午夜天堂影视香蕉久久| 久久精品亚洲麻豆av一区二区 | 紧缚捆绑精品一区二区| 国产日韩欧美一区二区三区综合 | 国产精品嫩草99a| 欧美一级夜夜爽| 欧美在线视频日韩| 成人黄色av电影| 美女尤物国产一区| 无吗不卡中文字幕| 亚洲欧洲综合另类| 国产亚洲一本大道中文在线| 欧美三级中文字幕| 91国产丝袜在线播放| 国产 欧美在线| 黄页网站大全一区二区| 日本午夜一区二区| 日本在线不卡一区| 久久97超碰国产精品超碰| 一本到不卡免费一区二区| 日韩午夜中文字幕| 国产一区二区不卡在线 | 人人精品人人爱| 成人免费看黄yyy456| 欧美丝袜丝nylons| 国产亚洲一区字幕| 爽好久久久欧美精品| 91免费视频大全| 久久久久99精品一区| 麻豆91在线看| 91丝袜美腿高跟国产极品老师| 欧美喷潮久久久xxxxx| 日本一二三不卡| 激情国产一区二区| 91精品国产综合久久久久| 亚洲一区二区三区在线看| 国产91色综合久久免费分享| 欧美一区二区在线播放| 亚洲一级二级三级| 色天使色偷偷av一区二区| 成人免费在线视频| www.性欧美| 亚洲天堂久久久久久久| 色婷婷综合中文久久一本| 国产精品入口麻豆九色| 成人午夜激情在线| 一区二区三区四区不卡视频| 色婷婷狠狠综合| 亚洲伦理在线免费看| 欧美亚洲尤物久久| 亚洲国产精品尤物yw在线观看| 欧美亚洲高清一区二区三区不卡| 国产网红主播福利一区二区| 国产成人免费xxxxxxxx| 亚洲一二三四在线观看| 欧美久久一二区| 成人黄色综合网站| 无码av中文一区二区三区桃花岛| 欧美变态tickling挠脚心| 麻豆精品新av中文字幕| 欧美美女bb生活片| 不卡av免费在线观看| 日日夜夜免费精品| 国产欧美日韩亚州综合| 欧美一级片在线观看| 欧洲生活片亚洲生活在线观看| 国产精品一区三区| 五月综合激情日本mⅴ| 国产午夜精品一区二区| 欧美日韩一区三区四区| 成人免费视频视频| 久久超碰97中文字幕| 亚洲精品日日夜夜| 国产精品情趣视频| 日韩欧美一区二区三区在线| 日本高清不卡视频| 成人中文字幕电影| 国产专区欧美精品| 九九国产精品视频| 日韩国产在线一| 午夜久久久久久久久久一区二区| 国产精品日日摸夜夜摸av| 精品免费视频.| 精品毛片乱码1区2区3区 | 欧美亚洲国产一区二区三区 | 91久久线看在观草草青青| 国产福利精品导航| 精品夜夜嗨av一区二区三区| 婷婷激情综合网| 奇米一区二区三区| 天堂久久一区二区三区| 日韩高清在线一区| 国产在线不卡一卡二卡三卡四卡| 亚洲成人激情自拍| 免费视频一区二区| 91在线观看下载| 精品国产免费一区二区三区四区| 国产精品欧美极品| 亚洲一区二区高清| 成人av小说网| 日韩一级欧美一级| 亚洲欧美日韩国产成人精品影院 | 婷婷久久综合九色国产成人| 成人av影视在线观看| 丁香婷婷综合色啪| 中文字幕欧美一区| 欧美人与禽zozo性伦| 国产精品视频九色porn| 日韩成人伦理电影在线观看| 日本乱人伦一区| 亚洲精品免费电影| 91麻豆免费视频| 国产精品拍天天在线| 99re热这里只有精品免费视频| 久久精品一区四区| 99久久综合精品| 亚洲人成在线播放网站岛国| 色综合咪咪久久| 亚洲美女视频一区| 不卡在线观看av| 亚洲精品国久久99热| 91麻豆自制传媒国产之光| 亚洲欧美怡红院| 在线观看91视频| 日本中文在线一区| 国产精品激情偷乱一区二区∴| 国产一区二区电影| 一区二区高清免费观看影视大全| 91成人网在线| 欧美aaaaa成人免费观看视频| 欧美一区二区三区视频在线观看 | 欧美精品第一页| 黑人巨大精品欧美一区| 国产蜜臀av在线一区二区三区| 成人性生交大片免费看中文 | 亚洲精品欧美二区三区中文字幕| 一本色道久久综合亚洲91| 一区二区三区四区蜜桃| 91免费版在线| 国产在线一区观看| 中文字幕精品三区| 欧美不卡一区二区三区| 风间由美一区二区三区在线观看 | 亚洲综合在线第一页| 日韩一区二区三区四区五区六区| 国产精品亚洲一区二区三区妖精| 国产精品家庭影院| 精品国产乱码久久久久久影片| 成人免费高清在线| 久久99九九99精品| 美女一区二区三区在线观看| 亚洲香肠在线观看| 一区二区三区国产豹纹内裤在线| 久久先锋影音av鲁色资源网| 欧美日韩免费观看一区三区| 色av综合在线| 欧美揉bbbbb揉bbbbb| 欧美日韩一区二区在线观看 | 精品国产精品一区二区夜夜嗨| 欧美伦理电影网| 精品伦理精品一区| 久久亚洲捆绑美女| 中文字幕不卡在线| ...xxx性欧美| 亚洲一区二区在线视频| 欧美aa在线视频| 成人18精品视频| 在线免费不卡视频| 91精品国产综合久久精品| 日韩精品一区二区三区中文精品| 久久美女艺术照精彩视频福利播放| 欧美不卡一区二区三区| 亚洲啪啪综合av一区二区三区| 亚洲无线码一区二区三区| 无码av免费一区二区三区试看| 日本视频中文字幕一区二区三区| 午夜av电影一区| 国产麻豆欧美日韩一区| 成人免费毛片嘿嘿连载视频| 色综合久久久久网| 日韩精品一区在线观看| 久久久久久久久久久久电影| 国产精品乱码人人做人人爱| 亚洲自拍偷拍欧美| 国产激情一区二区三区| 在线观看区一区二|