如何在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
相关产品推荐
相关产品推荐

