weixin_48056306 2024-04-16 17:25 采纳率: 25%
浏览 6

django rest framework

img


drf 我继承ModelViewSet返回的数据体是这样的,前端需要我给的数据和这个有所差别,后端需要对返回的数据体做二次处理,我需要自己加入一些自己的逻辑,请问继承ModelViewSet,我怎么才能获取到数据体,或者怎么写自己的逻辑?

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 17:25
    关注

    引自免费微信小程序:皆我百晓生

    在Django Rest Framework (DRF) 中,如果你想要在序列化模型之前或之后添加自定义逻辑,可以利用内置的视图集(ViewSets)和序列化器(Serializers)的功能。这里是一个详细的步骤来实现你的需求:

    1. 创建一个自定义序列化器(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__'
    
    1. 更新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路由,以便使用这个新的视图集。现在,当请求数据时,将会包含你添加的逻辑和处理后的结果。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月16日

悬赏问题

  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画
  • ¥15 hadoop中启动hive报错如下怎么解决
  • ¥15 如何优化QWebEngineView 加载url的速度
  • ¥15 关于#hadoop#的问题,请各位专家解答!
  • ¥15 如何批量抓取网站信息