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

如何在Django中基于两列实现查询集的高级过滤?

Django查询集高级过滤实现方案

需求回顾

  • 排除feetype_id为指定值(示例中为2,或代码中的last_fee_type)的CollectFee记录
  • 同时排除所有与上述被排除记录拥有相同boarder_id的其他记录

解决方案代码

修改你的feedue视图,先获取需要排除的住宿生ID集合,再批量排除关联记录:

def feedue(request):
    last_fee_type = FeeType.objects.last()
    # 先获取所有属于目标费型的住宿生ID集合
    excluded_boarder_ids = CollectFee.objects.filter(feetype_id=last_fee_type.id).values_list('boarder_id', flat=True)
    # 排除所有这些住宿生的收费记录
    boarders = CollectFee.objects.exclude(boarder_id__in=excluded_boarder_ids)
    
    context = {'boarders': boarders}
    return render(request, 'fee-due.html', context)

逻辑说明

  1. 获取待排除的住宿生ID:通过filter找到所有feetype_id匹配目标值的记录,再用values_list('boarder_id', flat=True)提取出对应的住宿生ID列表,这一步得到的是所有需要"连带排除"的住宿生ID集合。
  2. 批量排除关联记录:使用exclude(boarder_id__in=excluded_boarder_ids)直接排除所有属于这些住宿生的CollectFee记录,一次性完成"排除目标费型记录+排除同住宿生其他记录"的需求。

额外提示

如果担心FeeType.objects.last()可能返回空值(比如数据库中还没有费型数据),可以加个简单判断避免报错:

def feedue(request):
    last_fee_type = FeeType.objects.last()
    boarders = CollectFee.objects.all()
    if last_fee_type:
        excluded_boarder_ids = CollectFee.objects.filter(feetype_id=last_fee_type.id).values_list('boarder_id', flat=True)
        boarders = CollectFee.objects.exclude(boarder_id__in=excluded_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.22 13:09:27