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

Django中外键关联场景下获取包含Products与Categories表数据的QuerySet方法咨询

解决Django中同时获取产品与分类数据的问题

首先,咱们先搞懂你遇到的错误原因:data = products.objects.all()返回的是QuerySet(也就是多个产品对象的集合),而product_categories是单个products对象才有的反向关联属性(因为product_categories表中的product字段是指向products的外键)。你直接在整个集合上调用product_categories,就好比你问一整个书架“你的这本书的作者是谁”,书架没法回答,得拿出具体某本书才行。

接下来给你两种实用的解决方案,根据你的需求选就行:


方案1:预取关联数据,传递完整对象到模板(推荐)

这种方式能让你在模板里自然地遍历产品和它的分类,还能避免多次查询数据库的性能问题。

在Django Shell/视图中获取数据

用prefetch_related预取关联的分类数据:

from django.db.models import Prefetch

# 预取每个产品对应的product_categories,以及关联的category
data = products.objects.all().prefetch_related(
    Prefetch('product_categories__category')
)

在HTML模板中使用

拿到这个QuerySet后,直接传到模板,然后遍历每个产品,再遍历它的关联分类:

{% for product in data %}
    <div class="product-item">
        <h4>{{ product.name }}</h4>
        <p>SKU: {{ product.sku }} | 价格: {{ product.price }}</p>
        <p>所属分类: 
            {% for pc in product.product_categories.all %}
                {{ pc.category.category_name }}
                {% if not forloop.last %}, {% endif %}
            {% endfor %}
        </p>
    </div>
{% endfor %}

方案2:直接获取包含分类的字典数据(适合简单展示)

如果你只需要特定字段的扁平化数据,可以用values()或者结合聚合函数来处理:

基础版(会有重复条目)

data = products.objects.all().values(
    'name', 'sku', 'price',
    'product_categories__category__category_name'
)

注意:如果一个产品属于多个分类,这个QuerySet里会出现多条同一个产品的记录,每个分类对应一条。

聚合版(把分类合并成字符串)

如果你的项目用的是PostgreSQL,可以用StringAgg把同一个产品的所有分类合并成一个字符串:

from django.contrib.postgres.aggregates import StringAgg

data = products.objects.all().annotate(
    category_names=StringAgg('product_categories__category__category_name', delimiter=', ')
).values('name', 'sku', 'price', 'category_names')

这样每个产品条目里会多一个category_names字段,比如"电子产品, 手机",直接在模板里用{{ item.category_names }}就能展示。


最后再提个小建议:Django的模型类名推荐用大驼峰命名(比如Product代替products,Category代替categories),这是Python的PEP8规范,也能让代码更易读~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:19:08