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

