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

哎哎哎,較好的解決了,誇自己一下。

 

    

 

 

 

    

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM