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 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
Python实现k-means算法
Feb 23 Python
python: line=f.readlines()消除line中\n的方法
Mar 19 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
python BeautifulSoup库的安装与使用
Dec 17 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
Linux下php5.4启动脚本
2014/08/03 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
Linux中如何用命令创建目录
2015/01/12 面试题
小班重阳节活动方案
2014/02/08 职场文书
道路建设实施方案
2014/03/18 职场文书
绩效管理实施方案
2014/03/19 职场文书
综治维稳工作汇报
2014/10/27 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android