drf外键序列化

问题表述

  • 请求api时返回外键数据
  • drf序列化外键数据
  • drf 序列化中加工数据
  • drf 自定义序列化数据内容

 

看到网友们的方法 都感觉好像下不了手,故慢慢的实验

共识:已经用了drf的序列化类序列化了模型,并且能拿到数据,现在其中有个用户的外键只有id,现在需要拿到用户名

现在已经有的系列话的实现如下

from rest_framework import  viewsets,serializers

class Experiment_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Experiment
        fields = ('id', 'name', 'description','pid',"git_id",'job_name','creator_uid','addtime')

使用api请求数据如下所示,箭头指向的数据 是User表中的用户id;也就是experiment.creator_uid--->user.id

drf外键序列化_第1张图片

实验&处理

几个处理

  • 创建字段username 其中source指明字段的配置来自于creator_uid.username(读取creator_uid,creator_uid就自动产生对应的外键内容相当于一个user)
    drf外键序列化_第2张图片
  • 配合字段命名 get_ 函数 get_username 来获取数据 ,借助上面的实验,直接这样访问就返回了用户名
  • 在Fields 中指出 获取username 
class Experiment_Extra_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Experiment
        fields = ('id','username', 'name', 'description','pid',"git_id",'job_name','creator_uid','addtime')
                        #↑username 
    username = serializers.CharField(source='creator_uid.username')
    #与字段搭配
    def get_username(self,obj):
        return obj.creator_uid.username

在API中更换序列化类前后 效果对比

drf外键序列化_第3张图片drf外键序列化_第4张图片

其他方案

覆盖序列化类的表达函数 to_representation

几个注意

  1. 不需要 get_username 但是 依然要定义uername
  2. 在fields依然要声明username
  3. 注意获取数据与赋值的顺序
class Experiment_Extra_Serializer(serializers.ModelSerializer):
    
    class Meta:
        model = Experiment
        fields = ('id', 'name', 'description','username','pid',"git_id",'job_name','creator_uid','addtime')
    
    username = serializers.CharField(source='creator_uid.username')
    def to_representation(self, instance):
        ret_obj = super().to_representation(instance)
        ret_obj['username'] = instance.creator_uid.username
        return  ret_obj

补充 自定义模型无关的字段

如果使用与外键无关的完全自定义的字段 注意使用 serializers.SerializerMethodField 声明字段;其他的部分同前面的处理方式

job_url = serializers.SerializerMethodField()

参考文章

  • DRF 有无外键操作实例  http://www.manongjc.com/detail/13-rghuqvhuozwkemr.html
  • 序列化器中的to_representationhttps://blog.csdn.net/qq_43082970/article/details/104748622

你可能感兴趣的:(全栈,后端,drf,序列化,外键)