drf修改序列化字段

  • 缓解数据库查询压力(重写ListModelMixin的list方法)
    def list(self, request, *args, **kwargs):

        query_params = {"tar_time__lte": datetime.datetime.now()}
        if "tar_start_time" not in request.query_params:
            query_params['tar_time__gte'] = datetime.datetime.now().date() - datetime.timedelta(16)
        # 获取查询集
        queryset = self.filter_queryset(self.get_queryset().filter(**query_params))
        
        # 分页
        page = self.paginate_queryset(queryset.values('id'))
        # To select id instead of *
        ids = [i['id'] for i in page]
        # 以id查询
        page = RobotsLog.objects.filter(id__in=ids).order_by('-tar_time')
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
  • 方法1:通过序列化器修改字段(只做序列化返回)
class TestSerializer(serializers.ModelSerializer):
    file_path = serializers.SerializerMethodField()  # file_path默认来自get_file_path函数,当然serializers.SerializerMethodField()也可以指定函数

    @staticmethod
    def get_file_path(obj):
        """对模型类字段进行修改"""
        pass
  • 方法2:重写序列化器的to_representation方法
    def to_representation(self, instance):
        """
        Object instance -> Dict of primitive datatypes.
        """
        ret = OrderedDict()
        fields = self._readable_fields

        for field in fields:
            try:
                attribute = field.get_attribute(instance)
            except SkipField:
                continue
            check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute
            if check_for_none is None:
                ret[field.field_name] = None
            else:
                ret[field.field_name] = field.to_representation(attribute)

            if field.field_name == "picture_path2":  # 指定字段名
                if field.to_representation(attribute).startswith("http"): 
                    # 修改返回的字段值
                    ret[field.field_name] = field.to_representation(attribute)
                else:
                    oss = Oss(**settings.ALI_OSS_CONF["narwal_images"])
                    key = get_key(attribute, field)
                    ret[field.field_name] = oss.get_sign_url(key)
            if field.field_name == "picture_path":
                if field.to_representation(attribute).startswith("http"):
                    ret[field.field_name] = field.to_representation(attribute)
                else:
                    oss = Oss(**settings.ALI_OSS_CONF["narwal_images"])
                    key = get_key(attribute, field)
                    ret[field.field_name] = oss.get_sign_url(key)
            if field.field_name == "video_path":
                if field.to_representation(attribute).startswith("http"):
                    ret[field.field_name] = field.to_representation(attribute)
                else:
                    oss = Oss(**settings.ALI_OSS_CONF["narwal_logs"])
                    key = get_key(attribute, field)
                    ret[field.field_name] = oss.get_sign_url(key)
        return ret
  • 方法3:重写ListModelMixin的list方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DRF(Django Rest Framework)是一种用于构建Web API的强大框架,它提供了丰富的功能和工具来简化API的开发过程。在使用DRF时,我们经常需要定义视图和序列化器以及它们之间的关系来处理不同的请求和操作。 DRF的请求处理基于视图的操作方法,它们分别对应于HTTP方法,例如GET,POST,PUT,PATCH和DELETE。这些操作方法在视图中以函数的形式定义,并且通过装饰器或路由来映射到相应的URL。 序列化器是DRF的一个核心概念,它提供了一种简单而灵活的方式,将数据对象转换为可以被序列化和反序列化的格式,通常是JSON或XML。序列化器可以定义在视图中,也可以单独定义为一个类,然后在视图中使用。 在DRF中,我们可以通过定义不同的序列化器类来处理不同的操作。序列化器类可以继承自DRF提供的Serializer类或ModelSerializer类,后者自动为我们根据模型生成序列化字段。 使用序列化器,我们可以在视图中方便地对请求进行验证、数据转换和结果序列化等操作。在视图的操作方法中,我们可以通过调用序列化器的不同方法来进行这些操作。 例如,我们可以使用序列化器的`is_valid()`方法来验证请求的数据是否有效。我们还可以使用`save()`方法来保存数据,或者使用`data`属性来获取序列化后的数据。此外,我们还可以通过调用`serializer_class()`方法来获取当前视图使用的序列化器类。 总之,DRF的action序列化提供了一种方便而强大的方式来处理API的请求和操作。通过定义视图和序列化器,并将它们联系起来,我们可以在开发API时更加高效和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值