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)
说明
- 用
order_by('-duedate').first()替代last():默认last()是按模型主键排序,若主键不是按费用创建顺序生成,可能拿到错误的"最新费用"。按截止日期倒序取第一条,更符合业务逻辑。 - 直接查询
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
相关产品推荐
相关产品推荐

