如何在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)
逻辑说明
- 获取待排除的住宿生ID:通过
filter找到所有feetype_id匹配目标值的记录,再用values_list('boarder_id', flat=True)提取出对应的住宿生ID列表,这一步得到的是所有需要"连带排除"的住宿生ID集合。 - 批量排除关联记录:使用
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
相关产品推荐
相关产品推荐

