REST framework -- seralizer中添加額外字段的方法以及外鍵的處理


serializer中添加額外字段的方法:
#方法一: 修改model
class Animal(models.Model): name = models.CharField(max_length=50, default='') type = models.CharField(max_length=50, default='') country = models.ForeignKey(Country, blank=True, null=True) @property def country_area(self): return self.country.area class AnimalSerializer(serializers.Serializer): pk = serializers.IntegerField(read_only=True) name = serializers.CharField(max_length=50) type = serializers.CharField(max_length=50) country = serializers.PrimaryKeyRelatedField(read_only=True) country_area = serializers.FloatField(required=False, source='country_area’) #方法二: 不修改model 直接使用SerializerMethodField(method_name=None)字段 #SerializerMethodFiel是一個read-only字段 #當不指定其method_name時,默認為get_<field_name> #如果使用ModelSerializer並指定字段時,要包含此時定義的字段 class AnimalSerializer(serializers.ModelSerializer): country_area = serializers.SerializerMethodField() class Meta: model = Animal fields = ('id', 'name', 'type','country','country_area') def get_country_area(self, obj): return obj.country.area #方法三:可以在前端顯示時多顯示一個字段,post提交后端獲取到值之后先從validated_data中去掉再進行接下來的處理 class ParentsSerializer(serializers.ModelSerializer): kids_id = serializers.IntegerField(source='my_field') def create(self, validated_data): kids_id = validated_data.pop('my_field')

 

 

序列化時外鍵關系的處理: #第一種: class KidsSerializer(serializers.ModelSerializer): class Meta: model = Kids fields = '__all__' #訪問時默認顯示外鍵id ,創建時傳id #第二種: class KidsSerializer(serializers.ModelSerializer): class Meta: model = Kids fields = '__all__' depth = 1 #訪問時顯示外鍵字段的所有信息,但是只讀的,不可編輯,即新建時不能傳值 #第三種: class KidsSerializer(serializers.ModelSerializer): grade = serializers.SlugRelatedField(queryset=Grade.objects.all(), slug_field='id') class Meta: model = Kids fields = '__all__' #訪問時顯示id/其他,新建時傳id值/其他值 #序列化時反向關聯的字段的處理  class GradeFinanceSerializer(serializers.Serializer): id = serializers.IntegerField(required=True) name = serializers.CharField(read_only=True) class FinancePlanSerializer(serializers.ModelSerializer): grades = GradeFinanceSerializer(many=True) #訪問時只顯示定制的字段 新建時以列表形式傳值 #字段類型在數據庫中為枚舉的字段顯示問題: get_XXX_display level = serializers.CharField(source='get_level_display')

#添加get傳參的方法和過濾出想要顯示的數據
def get_queryset(self):
name = self.request.query_params.get('name', '')
if name != '':
return Group.objects.filter(name__icontains=name)
else:
return Group.objects.all()
 

 


免責聲明!

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



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