Django 如何获取指定分类下通过子分类间接关联的所有产品并扁平化输出
实现方案
你可以通过DRF的SerializerMethodField直接跨关联查询所有产品并扁平化返回,修改代码如下:
1. 修改序列化器
保留原有ProductSerializerSpecific,直接替换CategoryProducts序列化器即可,不需要中间的SubCategoryProductsSpecific序列化器:
class ProductSerializerSpecific(serializers.ModelSerializer): class Meta: model = Product fields = ('id','productName') class CategoryProducts(serializers.ModelSerializer): products = serializers.SerializerMethodField() class Meta: model = Category fields = ('id','products') def get_products(self, obj): # 跨子分类外键直接查询当前分类下的所有产品 product_queryset = Product.objects.filter(subCategoryType__categoryType=obj) return ProductSerializerSpecific(product_queryset, many=True).data
2. 优化视图查询(避免N+1性能问题)
给视图的查询集加上预加载逻辑,减少数据库查询次数:
class ListAllCategoryProducts(viewsets.ReadOnlyModelViewSet): queryset = Category.objects.prefetch_related( "category_type__product_subcategories" ).all() serializer_class = CategoryProducts
实现说明
原来的返回嵌套是因为你的序列化逻辑是「分类→序列化所有子分类→每个子分类再序列化自身产品」,就会出现两层products嵌套。修改后直接通过外键反向关联查询出当前分类下所有子分类绑定的全部产品,一次性序列化返回,就能得到你需要的扁平化结构。
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

