1

I was doing some research about function vs class based views and I found out that class based views are quite efficient. I have the following code snippet and would like to convert the function based view into class based view. How do I implement this correctly?

@api_view(['GET'])
def get_payslip_detail(request, pk, format=None):
    try:

        payslip = list(Payslip.objects.filter(id=pk).values(
            'payment_mode','payslip_no','month_ending','basic','id','employee'
        ))[0]
        # accesss object from list above 
        # access from object get id which is an integer >>>>> id=payslip['employee']

        employee = list(Employee.objects.filter(id=payslip['employee']).values(
        'user','hr_number','basic','tax_id_number', 'department', 'designation','id'))[0]

        payslip['emp'] = employee
        bank_acc = list(BankAccount.objects.filter(account_owner=payslip['employee']).values(
                'bank_acc_number','bank_id'
        ))[0]
        # append extra key to emp 
        payslip['acc_no']= bank_acc['bank_acc_number']
        bank_name= list(Bank.objects.filter(id=bank_acc['bank_id']).values('name'))[0]
        # print(bank_name)
        payslip['bank_name'] = bank_name['name']
        allowances = Allowance.objects.filter(payslip=pk).values('amount','name')
        deductions = Deduction.objects.filter(payslip=pk).values('amount','name')
        payslip['allowances'] = list(allowances)
        payslip['deductions'] = list(deductions)
        payslip['total_allowances'] = allowances.aggregate(net_allowance=Sum('amount'))['net_allowance']
        payslip['total_deductions'] = deductions.aggregate(net_deduction=Sum('amount'))['net_deduction']
        payslip['netpay'] = (payslip['total_allowances']+int(employee['basic']))-payslip['total_deductions']


    except Exception as e:
        # print(e)
        return Response(data=e, status=status.HTTP_400_BAD_REQUEST)
    return Response(data=payslip, status=status.HTTP_200_OK) 
1
  • In what way are you hoping that the class based view will be more efficient? You can change your view to use APIView as in MD. Khairul Basar's answer, but it won't improve performance or make the view any more readable. Commented Apr 3, 2018 at 13:11

1 Answer 1

2

You should follow the official doc about class based views here.

from rest_framework.views import APIView

class GetPayslipDetail(APIView):
    def get(request, pk, format=None, *args, **kwargs):
        try:

            payslip = list(Payslip.objects.filter(id=pk).values(
                'payment_mode', 'payslip_no', 'month_ending', 'basic', 'id', 'employee'
            ))[0]
            # accesss object from list above 
            # access from object get id which is an integer >>>>> id=payslip['employee']

            employee = list(Employee.objects.filter(id=payslip['employee']).values(
                'user', 'hr_number', 'basic', 'tax_id_number', 'department', 'designation', 'id'))[0]

            payslip['emp'] = employee
            bank_acc = list(BankAccount.objects.filter(account_owner=payslip['employee']).values(
                'bank_acc_number', 'bank_id'
            ))[0]
            # append extra key to emp 
            payslip['acc_no'] = bank_acc['bank_acc_number']
            bank_name = list(Bank.objects.filter(id=bank_acc['bank_id']).values('name'))[0]
            # print(bank_name)
            payslip['bank_name'] = bank_name['name']
            allowances = Allowance.objects.filter(payslip=pk).values('amount', 'name')
            deductions = Deduction.objects.filter(payslip=pk).values('amount', 'name')
            payslip['allowances'] = list(allowances)
            payslip['deductions'] = list(deductions)
            payslip['total_allowances'] = allowances.aggregate(net_allowance=Sum('amount'))['net_allowance']
            payslip['total_deductions'] = deductions.aggregate(net_deduction=Sum('amount'))['net_deduction']
            payslip['netpay'] = (payslip['total_allowances'] + int(employee['basic'])) - payslip['total_deductions']


        except Exception as e:
            # print(e)
            return Response(data=e, status=status.HTTP_400_BAD_REQUEST)

    return Response(data=payslip, status=status.HTTP_200_OK)

In your urls.py change to this

from .views import GetPayslipDetail

urlpatterns = [
    path('some-path/', GetPayslipDetail.as_view(), name='some_path'),
]
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.