Django中如何基于同模型其他字段ID过滤关联表对应字段值
实现指定查询的Django ORM编写方案
你可以通过两种方式实现需求,分别是分步查询更易读、单句链式查询更高效:
方案1:分步实现(逻辑清晰易调试)
按照你描述的步骤逐次过滤:
- 按
group_id过滤StockItems,获取对应item_invoice的ID列表
# 替换为你要查询的目标分组ID,比如示例里的group_id=1 target_group_id = 1 invoice_ids = StockItems.objects.filter(group_id=target_group_id).values_list('item_invoice_id', flat=True)
- 用拿到的
item_invoiceID过滤ItemsInvoice,获取关联的ItemsListID列表
item_ids = ItemsInvoice.objects.filter(id__in=invoice_ids).values_list('items_id', flat=True)
- 用
ItemsListID过滤得到对应的invoice_number
invoice_numbers = ItemsList.objects.filter(id__in=item_ids).values_list('invoice_number', flat=True)
方案2:单句跨表查询(性能更优,仅执行1次SQL)
Django ORM支持通过外键关联直接跨表查询,不需要多次请求数据库:
# 替换target_group_id为你的目标分组ID target_group_id = 1 invoice_numbers = ItemsList.objects.filter( itemsinvoice__stockitems__group_id=target_group_id ).distinct().values_list('invoice_number', flat=True)
说明:
itemsinvoice是ItemsInvoice模型的默认反向关联名(小写模型名)- 双下划线
__是Django ORM的跨关联查询语法,逐层关联到StockItems的group_id字段 - 加
distinct()是为了去重,避免多个库存条目关联到同一个发票号时返回重复结果
扩展:一次性获取所有分组对应的发票号
如果你需要直接拿到全部分组各自对应的所有发票号,不需要逐个传分组ID,可以用以下写法:
from django.db.models import F group_invoice_map = ItemsList.objects.filter( itemsinvoice__stockitems__group_id__isnull=False ).annotate( group_id=F('itemsinvoice__stockitems__group_id') ).values('group_id', 'invoice_number').distinct()
返回结果为字典列表,每个字典包含group_id和对应的invoice_number。
内容的提问来源于stack exchange,提问作者VEERA BABU
相关产品推荐
相关产品推荐

