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

Django使用select_related关联分类时出现AttributeError问题求助

问题解决方法

错误原因

你触发的AttributeError是因为queryset是多个Product对象的集合(QuerySet类型),只有单个Product实例才拥有category关联属性,集合本身没有这个属性。

正确实现方式

你的select_related('category')用法是对的,它已经实现了一次查询获取所有Product及其关联Category的需求(避免了N+1查询问题),只需要正确访问每个Product对象的category属性即可:

1. 遍历查询集中的所有产品(多结果场景)

queryset = Product.products.filter(
    category__slug=self.kwargs['category_slug']
).select_related('category')

# 遍历每个产品,获取对应的分类
for product in queryset:
    # 这里可以直接访问单个产品关联的Category对象
    print(product.category.name)
    print(product.category.slug)

2. 获取单个产品(单结果场景)

如果确定该分类下只有一个产品,或者只需要获取单个结果,可以用get()代替filter(),直接得到单个Product实例:

try:
    product = Product.products.filter(
        category__slug=self.kwargs['category_slug']
    ).select_related('category').get()
    
    print(product.category)  # 直接访问单个产品的分类
except Product.DoesNotExist:
    # 处理没有匹配产品的情况
    print("该分类下无产品")
except Product.MultipleObjectsReturned:
    # 处理匹配多个产品的情况
    print("该分类下存在多个产品,请使用filter遍历")

补充说明

select_related('category')会在查询Product时,通过SQL JOIN语句一次性把关联的InnerCategory数据查询出来,后续访问product.category不会再触发新的数据库查询,完全满足你"一次查询获取所有Product及其关联Category"的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:57:17