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爬取51job中hr的邮箱
May 14 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
基于Python实现扑克牌面试题
Dec 11 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
Django正则URL匹配实现流程解析
Nov 13 Python
Python创建文件夹与文件的快捷方法
Dec 08 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自动适应范围的分页代码
2008/08/05 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
php中上传文件的的解决方案
2018/09/25 PHP
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
在Python的web框架中配置app的教程
2015/04/30 Python
详解django自定义中间件处理
2018/11/21 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
numpy.array 操作使用简单总结
2019/11/08 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
公司领导推荐信
2013/11/12 职场文书
2016新年问候语大全
2015/11/11 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python