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

Django中如何基于同模型其他字段ID过滤关联表对应字段值

实现指定查询的Django ORM编写方案

你可以通过两种方式实现需求,分别是分步查询更易读、单句链式查询更高效:

方案1:分步实现(逻辑清晰易调试)

按照你描述的步骤逐次过滤:

  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)
  1. 用拿到的item_invoiceID过滤ItemsInvoice,获取关联的ItemsList ID列表
item_ids = ItemsInvoice.objects.filter(id__in=invoice_ids).values_list('items_id', flat=True)
  1. 用ItemsList ID过滤得到对应的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:30:01