Django REST Framework序列化外键获取外键的值方法
框架(架构)  /  管理员 发布于 7年前   249
需求:序列化外键,获取外键的除id之外的值
使用Django REST Framework虽然开发接口快速,但是如果想要获取到除外键id值之外的外键信息,直接继承serializers.ModelSerializer类,然后在fields中指定返回的字段是获取不到外键的其他值的,比如我现在需要外键的name属性值,下面就给大家介绍两种方法通过序列化外键来获取我们想要的外键的值。
这里有两个Model:问卷(Questionnaire);问题(Question)。一张问卷中包含多个问题,问题通过外键关联对应的问卷。
model.py
class Questionnaire(models.Model): '''问卷''' title = models.CharField('标题',max_length=100) class Meta: verbose_name_plural = '所有问卷' class Question(models.Model): '''问题''' #所属问卷 questionnaire = models.ForeignKey(Questionnaire,verbose_name='所属问卷',related_name='questions') #问题标题 title = models.CharField('问题',max_length=150) #是否是多选 is_checkbox = models.BooleanField('是否多选',default=False,help_text='是否是多选问题') class Meta: verbose_name_plural = '问题'
serializers.py
from rest_framework import serializersfrom question.models import Question,Questionnaire class QuestionnaireSerializer(serializers.ModelSerializer): class Meta: model = Questionnaire fields = ('title',) class QuestionSerializer(serializers.ModelSerializer): class Meta: model = Question fields = ('title','is_checkbox')
这是没有对外键进行序列化的代码,我们只能获得model中已有字段的值,那么现在我想通过QuestionSerializer这个序列化的类来得到其外键questionnaire的值(questionnaire_title),有一下两种方法实现
1.在序列化的时候创建一个新的字段(questionnaire_title)并且在这个字段中指定source=这个属性,具体操作如下
serializers.py
from rest_framework import serializersfrom question.models import Question,Questionnaire,Choice class QuestionnaireSerializer(serializers.ModelSerializer): class Meta: model = Questionnaire fields = ('title',) class QuestionSerializer(serializers.ModelSerializer): questionnaire_title = serializers.CharField(source='questionnaire.title') questionnaire_id = serializers.IntegerField() class Meta: model = Question fields = ('title','is_checkbox','questionnaire_title','questionnaire_id')
第二个字段questionnaire_id之所以没有添加source=这个属性,是因为这个字段名跟model中的字段名一样,django会自动识别,如果把这个字段换为questionnaire_ID那么就需要设置source=这个属性。
2.直接在model中通过property装饰器创建一个名为questionnaire_title的函数,并在函数中返回我们想要拿到的信息如:questionnaire_name,questionnaire_id,然后在序列化时指定为ReadOnlyField()字段;具体操作如下
models.py
class Questionnaire(models.Model): '''问卷''' title = models.CharField('标题',max_length=100) class Meta: verbose_name_plural = '所有问卷' class Question(models.Model): '''问题''' #所属问卷 questionnaire = models.ForeignKey(Questionnaire,verbose_name='所属问卷',related_name='questions') #问题标题 title = models.CharField('问题',max_length=150) #是否是多选 is_checkbox = models.BooleanField('是否多选',default=False,help_text='是否是多选问题') class Meta: verbose_name_plural = '问题' @property def questionnaire_title(self): return self.questionnaire.title,self.questionnaire.idserializers.py使用ReadOnlyfrom rest_framework import serializersfrom question.models import Question,Questionnaire class QuestionnaireSerializer(serializers.ModelSerializer): class Meta: model = Questionnaire fields = ('title',) class QuestionSerializer(serializers.ModelSerializer): questionnaire_title = serializers.ReadOnlyField() questionnaire_id = serializers.ReadOnlyField() class Meta: model = Question fields = ('title','is_checkbox','questionnaire_title','questionnaire_id')
这就是通过序列化外键来获得外键信息的两种方法,总的来说两种方法都特别简单实用,只不过第二种方法要多写几行代码而已。
以上这篇Django REST Framework序列化外键获取外键的值方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号