1. 程式人生 > >drf圖片字段序列化完整路徑

drf圖片字段序列化完整路徑

image url elf tin asi 數據格式 pes try tails

一.需求

  前端需要它想要的數據格式:

    技術分享圖片

  原有的數據格式:

技術分享圖片

二.定制化:

  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圖片字段序列化完整路徑