drf圖片字段序列化完整路徑
阿新 • • 發佈:2019-01-29
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圖片字段序列化完整路徑