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

