drf图片字段序列化完整路径

一.需求

  前端需要它想要的数据格式:

    

  原有的数据格式:

二.定制化:

  1.可以嵌套序列化pol_type,lit_des,area_detail,但结构如下:

class ChrDetailSerializer(serializers.ModelSerializer):
    """
    年代地层详情序列化
    """

    class Meta:
        model = Address_Lis
        fields = (‘region‘,)

class LisDetailSerializer(serializers.ModelSerializer):
    """
    岩石地层序列化
    """
    parent_categry = ChrDetailSerializer()

    class Meta:
        model = Address_Lis
        fields = (‘region‘, ‘parent_categry‘)

class PolarizedTypeSeriliazer(serializers.ModelSerializer):
    """
    偏光类型序列化
    """

    class Meta:
        model = PolarizedType
        fields = (‘pol_type‘,)

class LithologicalSeriliazer(serializers.ModelSerializer):
    """
    岩性序列化
    """

    class Meta:
        model = Lithological
        fields = (‘lit_des‘,)

class RockDetailSerializer(serializers.ModelSerializer):
    """
    详情序列化
    """
    pol_type = PolarizedTypeSeriliazer()
    lit_des = LithologicalSeriliazer()
    area_detail = LisDetailSerializer()

    class Meta:
        model = Rock
        fields = ‘__all__‘

    于是前端就不高兴了,不行这样的格式,前端说写起来有点麻烦,于是乎改呗。

  2. 想了下,利用serializer.SerializerMethodField()好像还挺容易解决的:

    好像是解决了,一看我去,完了,这个图片的字段不是完整的url啊,一想,我不可能把域名放在setting中,然后拼接吧,就太low了。

class RockDetailSerializer(serializers.ModelSerializer):
    """
    详情序列化
    """

    detail = serializers.SerializerMethodField(read_only=True)
    area_detail = serializers.SerializerMethodField(read_only=True)
    pol_type = serializers.SerializerMethodField(read_only=True)
    lit_des = serializers.SerializerMethodField(read_only=True)
    well_name = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Rock
        fields = (‘detail‘, ‘area_detail‘, ‘pol_type‘, ‘lit_des‘, ‘depth‘, ‘well_name‘)

    def get_detail(self, obj):
        try:
            return {‘id‘: obj.id, ‘image‘: obj.image.url, ‘lit_com‘: obj.lit_com, ‘multiple‘: obj.multiple,
                    ‘color‘: obj.color, ‘pal_fea‘: obj.pal_fea, ‘lit_fea‘: obj.lit_fea, ‘por_fea‘: obj.por_fea}
        except:
            return None

    def get_area_detail(self, obj):
        try:
            add_obj = obj.area_detail
            return str(add_obj.parent_categry.region) + ‘-‘ + str(add_obj.region)
        except:
            return None

    def get_pol_type(self, obj):
        try:
            return obj.pol_type.pol_type
        except:
            return None

    def get_lit_des(self, obj):
        try:
            return obj.lit_des.lit_des
        except:
            return None

    def get_well_name(self, obj):
        try:
            return obj.area_detail.parent_categry.parent_categry.region
        except:
            return None

  3.心想,可以在写一个序列化啊,于是又开干了:

    

class RockBasicSerializer(serializers.ModelSerializer):
    class Meta:
        model = Rock
        fields = (‘id‘, ‘image‘, ‘lit_com‘, ‘multiple‘, ‘color‘, ‘pal_fea‘, ‘lit_fea‘, ‘por_fea‘)

class RockDetailSerializer(serializers.ModelSerializer):
    """
    详情序列化
    """

    detail = serializers.SerializerMethodField(read_only=True)
    area_detail = serializers.SerializerMethodField(read_only=True)
    pol_type = serializers.SerializerMethodField(read_only=True)
    lit_des = serializers.SerializerMethodField(read_only=True)
    well_name = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Rock
        fields = (‘detail‘, ‘area_detail‘, ‘pol_type‘, ‘lit_des‘, ‘depth‘, ‘well_name‘)

    def get_detail(self, obj):
        try:
             rock_obj = RockBasicSerializer(obj, many=False, context={‘request‘: self.context[‘request‘]}).data
             return rock_obj
        except:
            return None

    def get_area_detail(self, obj):
        try:
            add_obj = obj.area_detail
            return str(add_obj.parent_categry.region) + ‘-‘ + str(add_obj.region)
        except:
            return None

    def get_pol_type(self, obj):
        try:
            return obj.pol_type.pol_type
        except:
            return None

    def get_lit_des(self, obj):
        try:
            return obj.lit_des.lit_des
        except:
            return None

    def get_well_name(self, obj):
        try:
            return obj.area_detail.parent_categry.parent_categry.region
        except:
            return None

哎哎哎,较好的解决了,夸自己一下。

    

    

   

原文地址:https://www.cnblogs.com/lyq-biu/p/10334247.html

时间: 2024-10-30 03:54:06

drf图片字段序列化完整路径的相关文章

js获取file控件的完整路径

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html > 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; c

dedecmsV5.7自定义图片字段调用方法

正常情况下,在列表页(也就是 {dede:list}标签)调用附加的图片类型字段则会出现Fatal error: Call to a member function GetInnerText() on a non-object in /include/taglib/channel/img.lib.php"此类错误,解决方案如下: 打开/include/taglib/channel/img.lib.php文件并找到 $innerTmp = $arcTag->GetInnerText(); 将

PHPCMS_单页添加图片字段

单页添加图片字段: <?php defined('IN_ADMIN') or exit('No permission resources.'); include $this->admin_tpl('header','admin');?> <div id="closeParentTime" style="display:none"></div> <link href="{CSS_PATH}dialog.css&

crm2013使用图片字段

在CRM2013能够加入图片字段(一个实体仅仅能加入一个图片字段) 保保存公布实体,看实体界面: 看不到图片.打开编辑窗口. 保存公布.刷新页面就能够看到了.

驱动层得到进程的完整路径

在得到进程EProcess之后,对于进程完整路径的获得一般有两种方法,一种是访问的进程的PEB结构,在PEB结构中保存有进程的完整路径,另一种方法就是采用访问_FILE_OBJECT的方法. 访问PEB的方法便存在线程靠挂的问题,因为运行于Ring0层的线程是无法去访问用户地址空间的,需要将线程暂时靠挂到目标呢进程,进而去访问进程的PEB结构.我一般都采用的访问_FILE_OBJECT的方法,避免了线程的靠挂问题,而且访问peb的方法会存在一个问题:如果想要进行进程拦截,在进程未启动之前就阻止进

pwd 查看”当前工作目录“的完整路径

Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. 1.命令格式: pwd [选项] 2.命令功能: 查看"当前工作目录"的完整路径 3.常用实例:       实例1:用 pwd 命令查看默认工作目录的完整路径 命令: [[email protected] ~]# pwd 输出: [[email protected]

javascript中外部js文件取得自身完整路径得办法

原文:javascript中外部js文件取得自身完整路径得办法 有时候我们需要引入一个外部js文件,这个js文件又需要用到自己的路径或者是所在的目录,别问怎么又这么变态的需求,开发做久了各种奇葩需求也就有了! 有人第一时间想到的是location.href,可是哥哥,那个引用页面的路径啊.比如a.html: <html> <script src="/b/c.js"></script> </html> 这样的话我们用location.hre

dedecms 文章页图片改为绝对路径

这几天在网站改版,想把网站做大,想做频道页二级域名,于是在做网站的过程中发现一个问题,dedecms开设二级域名后,在二级域名的文章页无法显示图片,查看源代码后发现问题,由于dedecms文章页中的图片默认是相对路径,所以在二级域名中无法调用到了. 使用下面的方法亲测可用: 修改目录include下的文件extend.func.php,在最后面添加一个函数方法function replaceurl($newurl){$newurl=str_replace('src="/uploads/allim

linux下查看进程的完整路径

当我们查看系统正在运行的进程时,有时候我们想查看以下进程的详细信息,包括绝对路径,这个时候ps的不足指出就显露出来了,而强大的top也只能查看到进程名而已. 这个时候怎么办呢?个人理解,在linux启动一个进程时,会给进程分配一个ID,就是我们的PID,而与此同时了,系统会在/proc下创建一个文件夹,以PID命名,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件,这就我们想要的,就像win下的exe文件,它是原始程序的一个链接,所以当我们用ls  -l的时候就能够得到我们的完整路