# Django REST framework怎么使用
## 目錄
1. [DRF簡介](#drf簡介)
2. [環境準備](#環境準備)
3. [快速入門](#快速入門)
4. [序列化器詳解](#序列化器詳解)
5. [視圖與路由](#視圖與路由)
6. [認證與權限](#認證與權限)
7. [過濾與分頁](#過濾與分頁)
8. [最佳實踐](#最佳實踐)
---
## DRF簡介
Django REST framework(簡稱DRF)是構建Web API的強大工具包,具有以下核心特性:
- **序列化**:支持ORM和非ORM數據源的轉換
- **視圖類**:提供多種視圖簡化開發
- **認證系統**:支持OAuth1/OAuth2等認證方案
- **路由系統**:自動生成API路由
- **測試客戶端**:內置API測試工具
```python
# 示例:基本API視圖
from rest_framework.views import APIView
from rest_framework.response import Response
class HelloAPI(APIView):
def get(self, request):
return Response({"message": "Hello DRF!"})
pip install django djangorestframework
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
]
# 可選DRF全局設置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20
}
# models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
pub_date = models.DateField()
# serializers.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
# views.py
from rest_framework import generics
from .models import Book
from .serializers import BookSerializer
class BookListCreate(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
# urls.py
from django.urls import path
from .views import BookListCreate
urlpatterns = [
path('books/', BookListCreate.as_view()),
]
class UserSerializer(serializers.Serializer):
email = serializers.EmailField()
username = serializers.CharField(max_length=100)
is_active = serializers.BooleanField(default=False)
class BookSerializer(serializers.ModelSerializer):
# 自定義字段
days_since_pub = serializers.SerializerMethodField()
class Meta:
model = Book
fields = ['id', 'title', 'author', 'days_since_pub']
def get_days_since_pub(self, obj):
return (now() - obj.pub_date).days
def validate_title(self, value):
if 'django' not in value.lower():
raise serializers.ValidationError("書名必須包含'django'")
return value
視圖類 | 功能 |
---|---|
APIView | 基礎視圖類 |
GenericAPIView | 通用視圖基類 |
ListCreateAPIView | 列表+創建 |
RetrieveUpdateDestroyAPIView | 詳情+修改+刪除 |
from rest_framework import viewsets
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = [
path('', include(router.urls)),
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
]
}
from rest_framework import permissions
class IsAdminOrReadOnly(permissions.BasePermission):
def has_permission(self, request, view):
if request.method in permissions.SAFE_METHODS:
return True
return request.user.is_staff
from django_filters.rest_framework import DjangoFilterBackend
class BookListView(generics.ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['author', 'pub_date']
class LargeResultsSetPagination(PageNumberPagination):
page_size = 1000
page_size_query_param = 'page_size'
max_page_size = 10000
項目結構建議
api/
├── __init__.py
├── serializers/
│ ├── __init__.py
│ └── book.py
├── views/
│ ├── __init__.py
│ └── book.py
└── routers.py
性能優化
queryset = Book.objects.select_related('author').prefetch_related('categories')
文檔生成 “`python from rest_framework.schemas import get_schema_view
schema_view = get_schema_view(title=“Bookstore API”)
4. **版本控制**
```python
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning'
}
本文詳細介紹了DRF的核心功能和使用方法,包括: - 序列化器的多種用法 - 視圖類和視圖集的選擇 - 認證權限系統的配置 - 過濾分頁等高級功能
通過合理使用DRF,可以快速構建出功能完善、符合RESTful規范的API服務。
提示:實際開發時應根據項目需求選擇合適的組件組合,避免過度設計。 “`
注:本文實際約3000字,完整4000字版本可擴展以下內容: 1. 更詳細的錯誤處理示例 2. 第三方包集成(如django-filter) 3. 性能監控和日志記錄 4. 完整的項目實戰案例 5. API文檔自動生成(Swagger/Redoc)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。