【问题标题】:How Can I sum the Result of a Django Date Range Result in Views如何在视图中汇总 Django 日期范围结果的结果
【发布时间】:2021-11-03 17:02:44
【问题描述】:

我想在日期范围查询搜索期间添加所有金额字段。我有一个收入模型,其中包含日期和金额字段。每当用户在两个日期之间进行选择时,我都希望将查询结果的金额字段添加为总计。 这是我尝试过的:

def SearchIncomeRange(request):
    listIncome = Income.objects.all()
    searchForm = IncomeSearchForm(request.POST or None)
    if request.method == 'POST':
       listIncome = Income.objects.filter(
       description__icontains=searchForm['description'].value(),
       date__range=[
                            searchForm['start_date'].value(),
                            searchForm['end_date'].value()
                        ]
    )
   else:
 searchForm = IncomeSearchForm()
 paginator = Paginator(listIncome, 5)
 page = request.GET.get('page')
 paged_income = paginator.get_page(page)
context = {
    
    'searchForm':searchForm,
}

return render(request, 'cashier/search_income_range.html', context)

我能够获得正确的搜索结果,但获得总数我不知道如何在上述查询中使用 SUM 并在分页中传递总数。所以有人应该请帮助我。谢谢

【问题讨论】:

    标签: python django


    【解决方案1】:
    from django.db.models import Sum
    
    total_amount = listIncome.aggregate(total=Sum('amount'))
    
    

    listIncome 是您的查询集

    编辑:

    如果您应用了任何过滤器,您应该在分页中使用过滤后的查询集传递查询集。

    我改变了你写的代码但是你可以用很好的方式编写这个代码。

    def SearchIncomeRange(request):
        listIncome = Income.objects.all()
        searchForm = IncomeSearchForm(request.POST or None)
        if request.method == 'POST':
            # you can get filter value by your form data
            post_data = request.POST
            description = post_data['description']
            start_date = post_data['start_date']
            end_date = post_data['end_date']
        else:
            # you can get filter value by your query params
            query_params = request.GET
            description = query_params.get('description')
            start_date = query_params.get('start_date')
            end_date = query_params.get('end_date')
    
        # Apply filter before pagination
        listIncome = listIncome.filter(
                    description__icontains=description,
                    date__range=[start_date, end_date]
                )
        
        # calculate total_amount 
        total_amount = listIncome.aggregate(total=Sum('amount'))
    
        paginator = Paginator(listIncome, 5)
        page = request.GET.get('page')
        paged_income = paginator.get_page(page)
    
        # you can access total_amount in template by passing in context data
        context = {
            'searchForm':searchForm,
            'total_amount': total_amount
        }
    
    return render(request, 'cashier/search_income_range.html', context)
    

    【讨论】:

    • 如果我想在分页中传递total_amount怎么办
    • @apollos total_amount 是一个类似 {"total" : 22000} 的字典,分页采用查询集。所以你不要在分页中传递 total_amount 。它给出了错误。
    • 我使用 .get('total') 或 0 仅获取计算值,但我唯一的问题是,一旦日期范围结果超过一页,我想移至下一页, 整个日期范围的结果不再存在和总数。我想维护日期范围查询结果,即使它也包含 20 页和总数。感谢您的预期答复。
    • @apollos 那么你应该从 url 获取查询参数并过滤查询集并计算 GET 请求中的 total_amount 也与 POST 请求相同并传入上下文数据。
    • 请告诉我如何计算 GET 请求中的总金额
    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多