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

如何查询带有through中间表的Django多对多关系中的对象

问题原因

你使用了自定义多对多中间表Pricing存储额外的价格字段,直接通过object.proposals.all查询返回的是Service模型实例,仅包含服务自身的属性,价格数据存在中间表中,因此无法直接获取。

解决方案

方案1:直接查询中间表(推荐,性能最优)

直接查询当前用户关联的所有Pricing实例,同时通过select_related预加载关联的服务数据,避免N+1查询问题:

  1. 视图层预处理数据并传入模板上下文:
# 视图代码示例
user_pricings = Pricing.objects.filter(user=request.user).select_related('service')
# 将user_pricings加入模板渲染的上下文
  1. 模板层遍历输出:
{% for pricing in user_pricings %}
    服务名称:{{ pricing.service.name }}
    对应价格:{{ pricing.price }}
{% endfor %}

方案2:基于现有Service查询反向取价格(仅适合小数据量)

如果不想修改现有查询逻辑,也可以通过Service到Pricing的反向关联,查询当前用户对应的定价:

{% for proposal in object.proposals.all %}
    服务名称:{{ proposal.name }}
    对应价格:{{ proposal.pricing_set.get(user=object).price }}
{% endfor %}

注意:该方案会每遍历一个服务就触发一次数据库查询,仅适合数据量极小的场景,不推荐正式环境使用。

优化建议

可以在User模型中封装查询方法,简化后续调用:

class User(AbstractUser):
    # 原有字段省略
    def get_services_with_price(self):
        return Pricing.objects.filter(user=self).select_related('service')

封装后模板中可以直接调用方法遍历:

{% for item in object.get_services_with_price %}
    服务名称:{{ item.service.name }}
    对应价格:{{ item.price }}
{% endfor %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:06:03