将Django类视图转为DRF API:新手求助实现CategoryList视图
将Django ListView转换为DRF API的方案
1. 定义序列化器
先为Category和Article模型编写序列化器,实现模型到JSON格式的转换:
from rest_framework import serializers from .models import Category, Article class CategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = ['id', 'slug', 'name'] # 按需选择需要返回的字段 class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = ['id', 'title', 'content', 'published_at'] # 根据业务需求调整字段
2. 编写DRF视图类
使用ListAPIView作为基类(专门处理列表数据的GET请求),同时实现原视图的分页、分类查询逻辑:
from rest_framework.generics import ListAPIView from rest_framework.pagination import PageNumberPagination from rest_framework.response import Response from django.shortcuts import get_object_or_404 from .models import Category, Article from .serializers import CategorySerializer, ArticleSerializer # 自定义分页类,对应原视图的paginate_by=10 class ArticlePagination(PageNumberPagination): page_size = 10 class CategoryArticleListAPIView(ListAPIView): serializer_class = ArticleSerializer pagination_class = ArticlePagination def get_queryset(self): # 用视图实例变量存储分类对象,替代原代码的global变量 self.category = get_object_or_404(Category, slug=self.kwargs.get('slug')) # 返回该分类下已发布的文章,和原逻辑一致 return self.category.articles.published() def list(self, request, *args, **kwargs): # 处理分页逻辑 queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) # 把分类信息和分页后的文章数据一起返回 return self.get_paginated_response({ 'category': CategorySerializer(self.category).data, 'articles': serializer.data }) # 不分页的情况(若关闭分页配置) serializer = self.get_serializer(queryset, many=True) return Response({ 'category': CategorySerializer(self.category).data, 'articles': serializer.data })
3. 配置URL路由
将视图映射到对应URL,和原Django视图的路由规则保持一致:
from django.urls import path from .views import CategoryArticleListAPIView urlpatterns = [ path('categories/<slug:slug>/articles/', CategoryArticleListAPIView.as_view(), name='category-articles-api'), ]
关键说明
- 替换全局变量:用视图实例变量
self.category存储分类对象,避免全局变量的副作用。 - 分页适配:通过自定义
PageNumberPagination类实现每页10条数据的分页规则,对应原视图的paginate_by配置。 - 响应结构:将分类信息与文章列表整合到同一响应中,对应原视图
get_context_data返回的category上下文数据。
内容的提问来源于stack exchange,提问作者Nasir ahmad Ahmady
相关产品推荐
相关产品推荐

