網(wǎng)站模板怎么建站新東方在線教育平臺官網(wǎng)
????????原生Django實現(xiàn)學生管理API需要200+行代碼,而DRF僅需20行!揭秘如何用序列化器提升10倍開發(fā)效率。
目錄
一、Web應用模式演進
1.1 前后端不分離
1.2 前后端分離
二、API接口規(guī)范之爭
2.1 RPC(遠程過程調用)
2.2 RESTful(表征狀態(tài)轉移)
核心原則:
冪等性保證:
三、DRF核心:序列化器
3.1 序列化器的作用
序列化:模型對象 → Python字典 → JSON
反序列化:JSON → Python字典 → 模型對象
3.2 定義序列化器
3.3 常用字段類型速查
四、DRF環(huán)境配置實戰(zhàn)
4.1 安裝與配置
4.2 項目配置
4.3 模型定義
五、DRF極簡開發(fā)模式
5.1 模型序列化器
5.2 視圖集配置
5.3 路由配置
5.4 接口測試效果
六、高級序列化技巧
6.1 自定義驗證
6.2 重寫創(chuàng)建/更新
6.3 只讀/只寫字段
七、DRF核心優(yōu)勢總結
一、Web應用模式演進
1.1 前后端不分離
-
服務端主導:后端直接生成HTML/CSS/JS
-
工作流程:
graph LR
A[瀏覽器請求] --> B[應用服務器]
B --> C[數(shù)據(jù)庫查詢]
C --> D[模板渲染]
D --> E[返回HTML]
1.2 前后端分離
-
核心解耦:
-
前端:獨立靜態(tài)資源服務(HTML/CSS/JS)
-
后端:純數(shù)據(jù)接口(JSON/XML)
-
-
數(shù)據(jù)交互流程:
graph LR
瀏覽器 --> |請求HTML| 靜態(tài)服務器
瀏覽器 --> |請求數(shù)據(jù)| 應用服務器
應用服務器 --> 數(shù)據(jù)庫
靜態(tài)服務器 --> |返回文件| 瀏覽器
應用服務器 --> |返回JSON| 瀏覽器
二、API接口規(guī)范之爭
2.1 RPC(遠程過程調用)
-
特點:
-
單一入口:
http://api.xxx.com/
-
POST請求為主
-
參數(shù)指定動作:
action=get_students&class=301
-
數(shù)據(jù)格式:Protobuf/JSON/XML
-
-
痛點:
-
接口命名混亂
-
函數(shù)參數(shù)膨脹
-
歷史接口重復
-
2.2 RESTful(表征狀態(tài)轉移)
-
核心原則:
-
資源即名詞:
/students/
、/avatars/
-
HTTP動詞定義操作:
HTTP方法 端點 動作 POST /students/ 創(chuàng)建學生 GET /students/ 獲取所有學生 GET /students/<pk>/ 獲取單個學生 PUT /students/<pk>/ 全量更新 PATCH /students/<pk>/ 部分更新 DELETE /students/<pk>/ 刪除學生 -
-
冪等性保證:
方法 冪等 安全 GET ? ? POST ? ? PUT/PATCH ? ? DELETE ? ?
三、DRF核心:序列化器
3.1 序列化器的作用
序列化:模型對象 → Python字典 → JSON
student = Student.objects.get(id=1)
serializer = StudentSerializer(student)
return JsonResponse(serializer.data)
反序列化:JSON → Python字典 → 模型對象
data = request.data
serializer = StudentSerializer(data=data)
if serializer.is_valid():serializer.save() # 保存到數(shù)據(jù)庫
3.2 定義序列化器
from rest_framework import serializersclass StudentSerializer(serializers.Serializer):id = serializers.IntegerField(read_only=True)name = serializers.CharField(max_length=100)sex = serializers.BooleanField(default=True)age = serializers.IntegerField(min_value=0)description = serializers.CharField(allow_blank=True)
3.3 常用字段類型速查
字段類型 | 說明 | 關鍵參數(shù) |
---|---|---|
CharField | 字符串 | max_length, allow_blank |
EmailField | 郵箱格式 | - |
IntegerField | 整型 | min_value, max_value |
DateTimeField | 日期時間 | format='%Y-%m-%d %H:%M' |
ChoiceField | 選擇字段 | choices=((1, '男'), (0, '女')) |
FileField | 文件上傳 | max_length, allow_empty_file |
四、DRF環(huán)境配置實戰(zhàn)
4.1 安裝與配置
# 創(chuàng)建虛擬環(huán)境
python -m venv drf_env
source drf_env/bin/activate# 安裝依賴
pip install django==3.2.4 djangorestframework pymysql
4.2 項目配置
settings.py
關鍵配置:
INSTALLED_APPS = [...'rest_framework','students', # 你的應用
]DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'students','HOST': '127.0.0.1','PORT': 3306,'USER': 'root','PASSWORD': '123'}
}
?4.3 模型定義
# students/models.py
class Student(models.Model):name = models.CharField(max_length=100, verbose_name="姓名")sex = models.BooleanField(default=True, verbose_name="性別")age = models.IntegerField(verbose_name="年齡")classmate = models.CharField(max_length=5, verbose_name="班級")description = models.TextField(verbose_name="簽名")class Meta:db_table = "tb_student"
五、DRF極簡開發(fā)模式
5.1 模型序列化器
# students/serializers.py
from rest_framework import serializers
from .models import Studentclass StudentModelSerializer(serializers.ModelSerializer):class Meta:model = Studentfields = '__all__' # 包含所有字段# fields = ('id', 'name', 'age') # 指定字段# exclude = ('description',) # 排除字段extra_kwargs = {'age': {'min_value': 0},'name': {'max_length': 50}}
5.2 視圖集配置
# students/views.py
from rest_framework.viewsets import ModelViewSet
from .models import Student
from .serializers import StudentModelSerializerclass StudentViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializer
?5.3 路由配置
# students/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import StudentViewSetrouter = DefaultRouter()
router.register('students', StudentViewSet)urlpatterns = [path('', include(router.urls))
]
5.4 接口測試效果
DRF自動生成調試界面:
-
GET
/students/
:學生列表 -
POST
/students/
:創(chuàng)建學生 -
PUT
/students/1/
:更新ID=1的學生 -
DELETE
/students/1/
:刪除學生
六、高級序列化技巧
6.1 自定義驗證
class StudentSerializer(serializers.ModelSerializer):...# 字段級驗證def validate_age(self, value):if value < 1:raise serializers.ValidationError("年齡不能小于1歲")return value# 對象級驗證def validate(self, attrs):if attrs['age'] > 30 and attrs['classmate'] == '101':raise serializers.ValidationError("30歲以上不能加入101班")return attrs
6.2 重寫創(chuàng)建/更新
def create(self, validated_data):# 添加額外邏輯if validated_data.get('score') > 90:validated_data['level'] = 'A'return Student.objects.create(**validated_data)def update(self, instance, validated_data):instance.name = validated_data.get('name', instance.name)...instance.save()return instance
?6.3 只讀/只寫字段
class UserSerializer(serializers.ModelSerializer):password = serializers.CharField(write_only=True) # 僅用于輸入last_login = serializers.DateTimeField(read_only=True) # 僅用于輸出class Meta:model = Userfields = ('username', 'password', 'last_login')
七、DRF核心優(yōu)勢總結
-
序列化器:自動處理模型?JSON轉換
-
視圖集:5行代碼實現(xiàn)CRUD接口
-
認證模塊:JWT/OAuth開箱即用
-
調試界面:自動生成API文檔
-
擴展生態(tài):過濾/分頁/限流插件