drf 我继承ModelViewSet返回的数据体是这样的,前端需要我给的数据和这个有所差别,后端需要对返回的数据体做二次处理,我需要自己加入一些自己的逻辑,请问继承ModelViewSet,我怎么才能获取到数据体,或者怎么写自己的逻辑?
django rest framework
drf 我继承ModelViewSet返回的数据体是这样的,前端需要我给的数据和这个有所差别,后端需要对返回的数据体做二次处理,我需要自己加入一些自己的逻辑,请问继承ModelViewSet,我怎么才能获取到数据体,或者怎么写自己的逻辑?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在Django Rest Framework (DRF) 中,如果你想要在序列化模型之前或之后添加自定义逻辑,可以利用内置的视图集(ViewSets)和序列化器(Serializers)的功能。这里是一个详细的步骤来实现你的需求:
- 创建一个自定义序列化器(Serializer)
首先,你需要创建一个自定义的序列化器类,继承自
rest_framework.ModelSerializer
。在这个类中,你可以重写to_representation()
方法,这是在序列化对象时调用的方法,你可以在这里添加你的逻辑。from rest_framework import serializers from .models import YourModel class CustomYourModelSerializer(serializers.ModelSerializer): # 如果需要,你可以在此添加额外字段或修改现有字段 custom_field = serializers.CharField(source='some_computed_value') def to_representation(self, instance): representation = super().to_representation(instance) # 在这里添加你的逻辑,例如处理某些值或者添加新的键值对 if 'night_dinner' in representation and representation['night_dinner'] == -1: representation['night_dinner_label'] = "Not Available" return representation class Meta: model = YourModel fields = '__all__'
- 更新ModelViewSet
然后,在你的
ModelViewSet
中,将默认的序列化器替换为你的自定义序列化器。from rest_framework import viewsets from rest_framework.response import Response from .serializers import CustomYourModelSerializer from .models import YourModel class YourModelViewSet(viewsets.ModelViewSet): queryset = YourModel.objects.all() serializer_class = CustomYourModelSerializer # 如果你需要在某个特定操作中添加更多逻辑,可以重写相应的方法,比如list(), retrieve()等 def list(self, request, *args, **kwargs): response = super().list(request, *args, **kwargs) # 在这里添加全局的逻辑,比如对整个响应数据进行处理 for item in response.data: if 'is_delete' in item and item['is_delete']: item.pop('is_delete') # 删除不需要显示的字段 return response
这样,每次当你通过
YourModelViewSet
访问数据时,都会先经过你的自定义序列化器,执行其中的逻辑,然后再返回给前端。在上述示例中,我们添加了一个计算字段,并且处理了night_dinner
为-1的情况,还展示了如何在列表操作中删除不必要的字段。确保你已经正确地配置了URL路由,以便使用这个新的视图集。现在,当请求数据时,将会包含你添加的逻辑和处理后的结果。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
- ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
- ¥15 请各位帮我看看是哪里出了问题
- ¥15 vs2019的js智能提示
- ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
- ¥15 uniapp的h5项目写一个抽奖动画
- ¥15 hadoop中启动hive报错如下怎么解决
- ¥15 如何优化QWebEngineView 加载url的速度
- ¥15 关于#hadoop#的问题,请各位专家解答!
- ¥15 如何批量抓取网站信息