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

如何在Django中获取包含指定商品的所有发票?

问题解决方案

错误原因

你写的代码报错是因为InvoicedItems.objects.filter(article=article)返回的是QuerySet(多个InvoicedItems对象的集合),而非单个InvoicedItems实例。只有单个模型实例才能直接访问外键属性invoice,QuerySet没有这个属性。

正确实现方式

推荐通过Invoice模型反向关联查询,这种方式更简洁高效,还能自动去重重复发票:

def get_invoices_by_article(article):
    # 利用Django的反向关联查询,直接筛选包含指定商品的发票
    return Invoice.objects.filter(invoiceditems__article=article).distinct()

补充说明:

  • invoiceditems__article是Django的双下划线关联查询语法,表示通过Invoice关联的InvoicedItems对象,筛选其中article字段匹配目标商品的记录。
  • .distinct()用于去重,避免同一发票因包含多个该商品条目而重复出现。

另一种实现方式(从InvoicedItems处理)

如果你坚持从InvoicedItems模型入手,可以先获取所有关联条目,再提取对应的发票对象并去重:

def get_invoices_by_article(article):
    # 预加载关联的Invoice,减少数据库查询次数
    invoiced_items = InvoicedItems.objects.filter(article=article).select_related('invoice')
    # 用集合去重,再转为列表返回
    return list({item.invoice for item in invoiced_items})

内容的提问来源于stack exchange,提问作者Marcin Gucia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:54:57