Django REST Framework序列化外键获取外键的值方法


Posted in Python onJuly 26, 2019

需求:序列化外键,获取外键的除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 serializers
from 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 serializers
from 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.id
serializers.py使用ReadOnly

from rest_framework import serializers
from 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序列化外键获取外键的值方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
对pyqt5之menu和action的使用详解
Jun 20 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
Python实现投影法分割图像示例(二)
Jan 17 Python
python对数组进行排序,并输出排序后对应的索引值方式
Feb 28 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
Python使用Matlab命令过程解析
Jun 04 Python
python 密码学示例——理解哈希(Hash)算法
Sep 21 Python
python 进程池pool使用详解
Oct 15 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
python代码实现备忘录案例讲解
Jul 26 Python
django admin.py 外键,反向查询的实例
Jul 26 #Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 #Python
python的re模块使用方法详解
Jul 26 #Python
Python企业编码生成系统总体系统设计概述
Jul 26 #Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 #Python
python的pstuil模块使用方法总结
Jul 26 #Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 #Python
You might like
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
python基础教程之对象和类的实际运用
2014/08/29 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
Python实现简单http服务器
2018/04/12 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
餐饮加盟计划书
2014/01/10 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
《听鱼说话》教学反思
2014/02/15 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
学雷锋月活动总结
2014/04/25 职场文书
法定代表人授权委托书
2014/09/19 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python