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中的赋值、浅拷贝、深拷贝介绍
Mar 09 Python
对于Python的Django框架使用的一些实用建议
Apr 03 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
pandas 数据实现行间计算的方法
Jun 08 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
解决新django中的path不能使用正则表达式的问题
Dec 18 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
解决Keras使用GPU资源耗尽的问题
Jun 22 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
Flask response响应的具体使用
Jul 15 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
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
PHP环境搭建最新方法
2006/09/05 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
dojo 之基础篇
2007/03/24 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
详解JavaScript中的函数、对象
2019/04/01 Javascript
python转换摩斯密码示例
2014/02/16 Python
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
python查看FTP是否能连接成功的方法
2015/07/30 Python
Saltstack快速入门简单汇总
2016/03/01 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
python实现textrank关键词提取
2018/06/22 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
金融事务专业求职信
2014/04/25 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
2014年党支部工作总结
2014/11/13 职场文书
检讨书大全
2015/01/27 职场文书
党支部审查意见
2015/06/02 职场文书
换届选举主持词
2015/07/03 职场文书
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server