drf图片字段序列化完整路径(代码片段)

lyq-biu lyq-biu     2023-03-02     747

关键词:

一.需求

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

    技术分享图片

  原有的数据格式:

技术分享图片

二.定制化:

  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

技术分享图片

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

 

    

 

 

 

    

   

drf框架serializer之modelserializer(代码片段)

一、基本语法在没有使用ModelSerializer序列化器类之前,我们定义的序列化器类都需要添加对应模型类字段的很多字段,如果添加的字段特别多,那么势必会影响开发效率和代码的可读性,因此会选择一种更为简洁的序列化器类来... 查看详情

08.drf-反序列化(代码片段)

三、反序列化使用3.1验证使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。验... 查看详情

drf序列化组件(代码片段)

1序列化组件介绍1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3.反序列化,完成数据校验功能2简单使用1写一... 查看详情

drf序列模块(代码片段)

..._all__'1.filter='__all__'::获取改类内所有的反序列|序列化字段2.filter=['name',.....]:获取反序列|序列化字段3.exclude=['name']:获取除内面之内的字段,与上属性不同时使用4.depth=d(int):自动深度,值代表深度次数,... 查看详情

drf框架序列化组件——字段验证(代码片段)

单个字段的验证1.在序列化器里定义校验字段的钩子方法  validate_字段2.获取字段的数据3.验证不通过,抛出异常  raiseserializers.ValidationError("校验不通过的说明")4.验证通过,直接返回字段数据#对title字段进行验证defv... 查看详情

drf之序列化(代码片段)

目录准备事项序列化组件初见序列化字段ModelSerializer重载create方法单条数据处理现阶段代码准备事项#models.pyfromdjango.dbimportmodelsclassPublisher(models.Model):title=models.CharField(max_length=32)address=models.CharField(max_length=128)d 查看详情

0802drf视图(代码片段)

昨日回顾:1.Serializer(序列化)1.ORM对应的query_set和ORM对象转换成JSON格式的数据1.在序列化类中定义自定义的字段:SerializerMethodField在类中定义get_自定义字段名(self,obj)方法2.read_only只在显示(查询)时才会有效。2.对前端POST过来的... 查看详情

drf高级五modelserializer(代码片段)

...模型自动生成一组字段。它将根据模型上的参数自动生成序列化程序的验证程序。它包括create()和update()简单默认实现。fromrest_frameworkimportserializersclassProductSerializer(serializers.ModelSerializer):classMeta:model=Productfields=__all__#exclude=(created,)... 查看详情

drf序列化组件(代码片段)

drf序列化组件单表序列化models.pyfromdjango.dbimportmodelsfromdjango.confimportsettingsclassUser(models.Model):SEX_CHOICES=((0,‘男‘),(1,‘女‘))name=models.CharField(max_length=64,verbose_name=‘姓名‘)password=models.CharField(max_length=64)age=models.IntegerField()height=model... 查看详情

drf序列化组件(代码片段)

目录1一序列化器-Serializer1.1定义序列化器1.2创建Serializer对象1.3序列化器的使用1.3.1序列化1.3.1.1基本使用1.3.1.2高级用法source和serializers.SerializerMethodField()的用法1.3.2反序列化1.3.2.1数据验证1)validate_字段名2)validate3)validators1.3.2.2反序... 查看详情

drf序列化组件(代码片段)

rest_framework序列化之Serializer步骤:1.自定义一个类,继承Serializer类;2.在类中写要序列化的字段;3.使用:在views.py文件中,book_ser=BookSerializer(book_list,many=True),book_ser.data就是序列化后的数据。当序列化的数据有多条(为QuerySet对... 查看详情

序列化字段时如何获取字符串片段(Django / DRF)

】序列化字段时如何获取字符串片段(Django/DRF)【英文标题】:Howtotakesliceofstringwhenserializingafield(Django/DRF)【发布时间】:2019-01-2016:15:12【问题描述】:第一次在这里问,我会尽量听起来很聪明!因此,我有一个名为“Article”的... 查看详情

drf框架之modelserializer序列化器(代码片段)

ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样。ModelSerializer与常规的Serializer相同,但提供了:基于模型类自动生成一系列字段基于模型类自动为Serializer生成validators,比如unique_together包含默认的create()和update()的... 查看详情

09.drf-modelserializer(代码片段)

四、模型类序列化器ModelSerializer如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。ModelSerializer与常规的Serializer相同,但提供了:基于模型类自动... 查看详情

drf_序列化(代码片段)

Django内置的serializers(对象转成json数据)rest_framework序列化继承Serializers1.单独新建py文件,写一个类继承Serializers2.在类中写要序列化的字段fromrest_framwork.serializersimportResponseclassBookSerializer(serializer.Serializer): 1.#以下两种方式都... 查看详情

16-drf工程搭建与序列化器(代码片段)

...amework‘,]使用DjangoRESTframework快速实现图书的RESTAPI2、创建序列化器1、在Book应用下新建serializers.py用于保存该应用的序列化器,创建一个BookInfoSerializer用于序列化与反序列化。fromrest_frameworkimportserializersfromBook.modulesimportBookInfoclassB... 查看详情

drf序列化代码(代码片段)

DRF序列化  ---要安装Djangorestframework  ---要使用的时候要在setting中注册app--rest_framework  ---使用之前要定义一个序列化器,指定要序列化的字段  下面是models中的表:fromdjango.dbimportmodels#Createyourmodelshere.__all__=[‘Book‘,‘Pu... 查看详情

drf框架之serializer序列化器的序列化操作(代码片段)

在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer.今天,我们就先来学习一下Serializer序列化器。使用Serializer序列化器的开发步骤:1.定义Serializer序列化器首先,我们要在子应用中,创建见一个serializers.py文件... 查看详情