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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 11:21:02