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

Django高级过滤:获取未缴纳最新费用的不重复寄宿生列表

解决未缴纳最新费用寄宿生重复显示问题

你的问题出在查询对象选错了:当前从CollectFee模型查询,每个寄宿生的过往缴费记录都会生成一条结果,自然会重复显示。

直接从Boarder模型入手筛选是最直接高效的方案,修改后的视图代码如下:

def feedue(request):
    # 确保获取的是最新的费用类型,建议按截止日期倒序取第一条(比last()更可靠)
    last_fee_type = FeeType.objects.order_by('-duedate').first()
    
    # 筛选所有没有缴纳该最新费用的寄宿生
    boarders = Boarder.objects.exclude(collectfee__feetype=last_fee_type)
    
    context = {'boarders': boarders}
    return render(request, 'fee-due.html', context)

说明

  1. 用order_by('-duedate').first()替代last():默认last()是按模型主键排序,若主键不是按费用创建顺序生成,可能拿到错误的"最新费用"。按截止日期倒序取第一条,更符合业务逻辑。
  2. 直接查询Boarder模型:返回的是寄宿生对象集合,每个寄宿生只会出现一次,彻底解决重复问题。

如果因为某些场景必须从CollectFee查询,也可以用distinct()去重,但这种方式效率更低,不推荐:

def feedue(request):
    last_fee_type = FeeType.objects.order_by('-duedate').first()
    # 去重获取未缴费的寄宿生ID,再查询寄宿生信息
    unpaid_boarder_ids = CollectFee.objects.exclude(feetype=last_fee_type).values_list('boarder_id', flat=True).distinct()
    boarders = Boarder.objects.filter(id__in=unpaid_boarder_ids)
    
    context = {'boarders': boarders}
    return render(request, 'fee-due.html', context)

内容的提问来源于stack exchange,提问作者Abdul Jabbar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:55:21