问题表述
- 请求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

实验&处理
几个处理
- 创建字段username 其中source指明字段的配置来自于creator_uid.username(读取creator_uid,creator_uid就自动产生对应的外键内容相当于一个user)

- 配合字段命名 get_<fielsdname> 函数 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中更换序列化类前后 效果对比
![]() ![]() |
其他方案
覆盖序列化类的表达函数 to_representation
几个注意
- 不需要 get_username 但是 依然要定义uername
- 在fields依然要声明username
- 注意获取数据与赋值的顺序
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()
def get_job_url(self,ins):
return wapper(ins.url) #some thing you do
参考文章
- DRF 有无外键操作实例 http://www.manongjc.com/detail/13-rghuqvhuozwkemr.html
- 序列化器中的to_representationhttps://blog.youkuaiyun.com/qq_43082970/article/details/104748622

本文介绍了如何在Django REST Framework(DRF)中处理外键序列化,通过添加自定义字段来获取外键关联的用户名。在序列化类中创建字段并指定source为外键字段的属性,同时定义一个获取用户名的方法。还探讨了其他解决方案,如覆盖to_representation方法,并补充了如何添加与外键无关的自定义字段。

1853

被折叠的 条评论
为什么被折叠?



