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实现监控windows服务并自动启动服务示例
Apr 17 Python
Python StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
Python实现短网址ShortUrl的Hash运算实例讲解
Aug 10 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 Python
使用Bazel编译TensorBoard教程
Feb 15 Python
python爬取豆瓣电影TOP250数据
May 23 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
Zerg基本策略
2020/03/14 星际争霸
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
javascript校验价格合法性实例(必须输入2位小数)
2014/05/05 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
Python enumerate遍历数组示例应用
2008/09/06 Python
python实现ping的方法
2015/07/06 Python
Windows下为Python安装Matplotlib模块
2015/11/06 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
python表格存取的方法
2018/03/07 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
python列表推导式操作解析
2019/11/26 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
电子商务毕业生求职信
2013/11/10 职场文书
企业新年寄语
2014/04/04 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL