You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:40:38