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

Django DRF 如何在后端直接触发Serializer的expandable_fields字段扩展

实现方法

你之前用model_to_dict是直接从ORM实例转字典,完全没有走你定义的OrdenTrabajoserializer的序列化逻辑,自然不会触发expandable_fields的扩展逻辑,按如下步骤修改即可:

第一步:修改post方法逻辑,手动给序列化器传入expand参数

你需要在实例化序列化器的时候,主动在上下文里指定要扩展的字段,不需要依赖前端传参,代码如下:

class facturarOrdenV2viewSet(generics.ListAPIView):
    queryset = Orden_trabajo.objects.all()
    serializer_class = OrdenTrabajoserializer
    permit_list_expands = ['vehiculo', 'asesor', 'servicio_orden_registro']

    def post(self, request, *args, **kwargs):
        orden = self.kwargs.get('orden', None)
        ordenTrabajo = self.queryset.get(pk = orden)
        # 手动指定要扩展的字段,触发序列化器的扩展逻辑
        serializer = self.serializer_class(
            ordenTrabajo,
            context={
                # 要扩展哪些字段就把对应的字段名加到列表里
                'expand': ['vehiculo', 'asesor', 'servicio_orden_registro']
            }
        )
        # 这里serializer.data就是扩展后的完整数据,替换你之前的dict_obj即可
        dict_obj = serializer.data
        print(dict_obj)

        return Response({'OK': '操作成功', 'data': dict_obj})

可选优化:全局默认扩展所有允许的字段

如果希望这个视图所有返回的序列化数据都默认扩展permit_list_expands里的所有字段,不需要每次手动传,可以重写get_serializer_context方法:

def get_serializer_context(self):
    context = super().get_serializer_context()
    context['expand'] = self.permit_list_expands
    return context

重写之后,不管是默认的list方法还是你自定义的post方法,只要调用self.get_serializer()实例化序列化器,都会自动带上expand参数,不需要重复传递。

注意点

  • 不要用model_to_dict处理需要序列化返回的数据,一定要走你自定义的序列化器逻辑,否则你在序列化器里定义的所有规则(包括字段扩展、字段校验、格式转换等)都不会生效。
  • 如果只需要扩展部分字段,修改context['expand']里的列表内容即可,比如只扩展vehiculo就写成context['expand'] = ['vehiculo']。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:18:02