Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在实现prefetch_related()方法后追加键和值_Django_Python 3.x_Django Rest Framework_Django Views - Fatal编程技术网

Django 如何在实现prefetch_related()方法后追加键和值

Django 如何在实现prefetch_related()方法后追加键和值,django,python-3.x,django-rest-framework,django-views,Django,Python 3.x,Django Rest Framework,Django Views,我已经使用GET方法实现了一个基于类的视图,以获取每个id的工资单详细信息。如何在工资单对象中附加net_津贴,使JSON看起来像这样: { "employee__user__id": 2, "payslip_no": "GGT5698", "employee__user__first_name": "Nick", "basic_salary__salary_value": 80000.0, "net_allowances": 5400.0, "t

我已经使用GET方法实现了一个基于类的视图,以获取每个id的工资单详细信息。如何在工资单对象中附加net_津贴,使JSON看起来像这样:

{
    "employee__user__id": 2,
    "payslip_no": "GGT5698",
    "employee__user__first_name": "Nick",
    "basic_salary__salary_value": 80000.0,
    "net_allowances": 5400.0,
    "total_deductions": 2500.0,
    "payment_mode__name": "Bank",
    "month_ending": "2018-03-16",
    "employee__user__last_name": "Cannon"
}



class PayrollView(APIView):

    def get(self, request, pk, format=None):
        try:

            payslip = Payslip.objects.filter(id=pk).prefetch_related('user', 'employee').values(
                'payment_mode__name', 'payslip_no', 'allowances__amount', 'deductions__amount', 'month_ending', 'basic_salary__salary_value', 'employee__user__last_name', 'employee__user__first_name', 'employee__user__id'
            )

            net_allowance = payslip.aggregate(
                net_allowance=Sum('allowances__amount'))
        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)
试试这个

payslip = Payslip.objects.filter(id=pk).prefetch_related('user', 'employee')
result = payslip.aggregate(
    net_allowance=Sum('allowances__amount')).values(
    'payment_mode__name', 'payslip_no', 'allowances__amount','deductions__amount', 'month_ending', 'basic_salary__salary_value',
    'employee__user__last_name', 'employee__user__first_name', 
    'employee__user__id','net_allowance' 
) 
使用.annotate代替.aggregate


我得到一个TypeError“values不接受任何给定的参数”,它不是JSON可序列化日志。然后我删除了。在payslip对象中的预回迁相关方法之后添加了它。我只看到了净值,但其余的JSON数据不可见。我认为您需要注释而不是聚合
 payslip = Payslip.objects.filter(
            id=pk).prefetch_related('user', 'employee').values(
            'payment_mode__name', 'payslip_no', 'allowance_types', 'deduction_types', 'month_ending', 'basic_salary__salary_value',
            'employee__user__last_name', 'employee__user__first_name',
            'employee__user__id'
        ).annotate(
            net_allowance=Sum('allowances__amount'))