使用Django REST框架构建高效API
1. Django REST框架入门
1.1 使用Django开发REST接口
通过图书管理系统案例演示如何实现数据的增删改查接口。前后端交互采用JSON格式。
# views.py
from datetime import datetime
class BookListView(View):
"""查询书籍列表并新增书籍"""
def get(self, request):
books = Book.objects.all()
result = []
for item in books:
result.append({
'id': item.id,
'title': item.title,
'publish_date': item.publish_date,
'views': item.views,
'comments': item.comments,
'cover': item.cover.url if item.cover else ''
})
return JsonResponse(result, safe=False)
def post(self, request):
data = json.loads(request.body)
new_book = Book.objects.create(
title=data['title'],
publish_date=datetime.strptime(data['date'], '%Y-%m-%d').date()
)
return JsonResponse({
'id': new_book.id,
'title': new_book.title,
'publish_date': new_book.publish_date,
'views': new_book.views,
'comments': new_book.comments,
'cover': new_book.cover.url if new_book.cover else ''
}, status=201)
class BookDetailView(View):
def get(self, request, book_id):
try:
book = Book.objects.get(id=book_id)
except Book.DoesNotExist:
return HttpResponse(status=404)
return JsonResponse({
'id': book.id,
'title': book.title,
'publish_date': book.publish_date,
'views': book.views,
'comments': book.comments,
'cover': book.cover.url if book.cover else ''
})
def put(self, request, book_id):
try:
book = Book.objects.get(id=book_id)
except Book.DoesNotExist:
return HttpResponse(status=404)
data = json.loads(request.body)
book.title = data['title']
book.publish_date = datetime.strptime(data['date'], '%Y-%m-%d').date()
book.save()
return JsonResponse({
'id': book.id,
'title': book.title,
'publish_date': book.publish_date,
'views': book.views,
'comments': book.comments,
'cover': book.cover.url if book.cover else ''
})
def delete(self, request, book_id):
try:
Book.objects.get(id=book_id).delete()
return HttpResponse(status=204)
except Book.DoesNotExist:
return HttpResponse(status=404)
# urls.py
urlpatterns = [
path('books/', views.BookListView.as_view()),
path('books//', views.BookDetailView.as_view())
]
测试用例
- 获取所有书籍:GET /books/ 返回状态码200
- 获取单本书籍:GET /books/5/ 返回状态码200
- 新增书籍:POST /books/ 发送JSON数据,返回状态码201
- 修改书籍:PUT /books/8/ 发送JSON数据,返回状态码200
- 删除书籍:DELETE /books/8/ 返回状态码204
1.2 REST接口开发核心任务
主要包含三个操作流程:
- 将请求数据转换为模型对象
- 执行数据库操作
- 将模型对象转换为响应数据
序列化与反序列化
序列化:将模型对象转换为JSON格式
books = Book.objects.all()
serialized = [serialize_book(book) for book in books]
return JsonResponse(serialized, safe=False)
反序列化:将JSON数据转换为模型对象
data = json.loads(request.body)
new_book = Book.objects.create(**data)
2. Django REST Framework基础
2.1 环境配置
pip install djangorestframework
在settings.py中添加:
INSTALLED_APPS += ['rest_framework']
2.2 快速体验DRF
# serializers.py
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
# views.py
from rest_framework.viewsets import ModelViewSet
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
# urls.py
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns += router.urls
3. 序列化器详解
3.1 字段定义
| 字段类型 | 示例 |
|---|---|
| CharField | name = serializers.CharField(max_length=100) |
| IntegerField | pages = serializers.IntegerField() |
| DateField | publish_date = serializers.DateField() |
3.2 关联对象处理
- PrimaryKeyRelatedField: 返回关联对象ID
- StringRelatedField: 返回关联对象字符串表示
- NestedSerializer: 嵌套序列化关联对象
3.3 数据验证
def validate_title(self, value):
if 'django' not in value.lower():
raise serializers.ValidationError("必须包含Django关键词")
return value
4. 视图组件
4.1 核心视图类
- APIView: 基础视图类
- GenericAPIView: 提供通用方法
- ModelViewSet: 集成增删改查
4.2 视图集使用
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
@action(methods=['get'], detail=False)
def recent(self, request):
latest_book = Book.objects.last()
serializer = self.get_serializer(latest_book)
return Response(serializer.data)
4.3 路由配置
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = [
path('', include(router.urls)),
]