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

Django Rest Framework嵌套序列化器未返回预期值问题求助

问题根因

你当前的嵌套序列化逻辑没有对销售报表条目做过滤:SalesReportDetailSerializer2 会直接返回每个销售报表关联的所有SalesReportItem,不会限制为外层当前零件对应的条目,因此出现返回数据冗余的问题。


解决方案

1. 修改序列化器逻辑,过滤对应零件的销售条目

调整serializers.py代码如下:

class SalesReportItemDetailSerializer2(serializers.ModelSerializer):
    class Meta:
        model = SalesReportItem
        fields = ["quantity", "site"]


class SalesReportDetailSerializer2(serializers.ModelSerializer):
    # 改用自定义方法获取过滤后的条目
    sales_report_items = serializers.SerializerMethodField()

    class Meta:
        model = SalesReport
        fields = ["id", "date", "sales_report_items"]

    def get_sales_report_items(self, obj):
        # 从上下文获取当前外层的零件实例
        current_part = self.context["current_part"]
        # 过滤出同时属于当前报表和当前零件的条目
        filter_items = obj.sales_report_items.filter(part=current_part)
        return SalesReportItemDetailSerializer2(filter_items, many=True).data


class PartDetailSerializer(serializers.ModelSerializer):
    # 改用自定义方法传递零件上下文到子序列化器
    sales_report_parts = serializers.SerializerMethodField()

    class Meta:
        model = Part
        fields = ["id", "name", "sales_report_parts"]

    def get_sales_report_parts(self, obj):
        # 将当前零件实例传入子序列化器上下文
        context = self.context
        context["current_part"] = obj
        return SalesReportDetailSerializer2(
            obj.sales_report_parts.all(),
            many=True,
            context=context
        ).data

2. 优化预查询逻辑避免N+1性能问题

调整views.py的预查询配置,减少数据库查询次数:

from django.db.models import Prefetch

class SalesReportDetailViewSet2(ModelViewSet):
    queryset = Part.objects.prefetch_related(
        Prefetch(
            "sales_report_parts",
            queryset=SalesReport.objects.prefetch_related(
                Prefetch(
                    "sales_report_items",
                    queryset=SalesReportItem.objects.select_related("part")
                )
            )
        )
    ).all()
    serializer_class = PartDetailSerializer
    pagination_class = TestPagination

冗余字段清理建议

你的Part模型中已经通过SalesReport的多对多反向关联related_name="sales_report_parts"建立了关联关系,额外定义的sales_reports多对多字段属于冗余配置,建议删除避免后续关联逻辑冲突。

内容的提问来源于stack exchange,提问作者Daniel Guardado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:45:02