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

