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

Django中如何将薪资单详情函数视图转换为类视图

嘿,我来帮你把这个基于函数的DRF视图转成基于类的版本~给你准备了两种方案,看哪种更贴合你的需求:

方案1:直接继承APIView,和原函数逻辑完全对齐

这种方式最贴近你原来的代码逻辑,手动实现get方法,保留你对字段筛选的处理:

首先导入必要的模块:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Payslip

然后定义类视图:

class PayslipDetailView(APIView):
    def get(self, request, pk, format=None):
        try:
            # 用.first()替代list(...)[0],空结果时返回None而非抛出IndexError,更安全
            payslip = Payslip.objects.filter(id=pk).values(
                'payment_mode','payslip_no','month_ending','basic','id','employee'
            ).first()
            
            if not payslip:
                return Response({"error": "薪资单不存在"}, status=status.HTTP_404_NOT_FOUND)
            
            return Response(payslip)
        except Exception as e:
            return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)

方案2:用DRF通用类视图RetrieveAPIView(推荐,更符合DRF最佳实践)

DRF的通用类视图已经封装了单对象查询的逻辑,配合序列化器使用更简洁规范,也方便后续扩展权限、过滤等功能:

第一步先定义序列化器,指定要返回的字段:

from rest_framework import serializers
from .models import Payslip

class PayslipDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Payslip
        fields = ['payment_mode','payslip_no','month_ending','basic','id','employee']

然后定义类视图:

from rest_framework.generics import RetrieveAPIView

class PayslipDetailView(RetrieveAPIView):
    queryset = Payslip.objects.all()
    serializer_class = PayslipDetailSerializer
    # lookup_field默认就是'pk',这行可以省略,只有用非pk的主键字段时才需要修改

最后别忘了修改路由

原来的函数视图路由:

path('payslip/<int:pk>/', get_payslip_detail),

改成类视图的路由:

path('payslip/<int:pk>/', PayslipDetailView.as_view()),

两种方案都能实现原函数的功能,方案2更符合DRF的设计理念,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者Philip Mutua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:22