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方法

版权声明:本文为weixin_41449756原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。