Django REST Framework序列化外键获取外键的值实例

  • 更新时间:2020-07-14 10:04:21
  • 编辑:申睿颖
我们帮大家精选了相关的编程文章,网友漕高逸根据主题投稿了本篇教程内容,涉及到Django、REST、Framework、序列化、外键、Django REST Framework序列化外键获取外键的值方法相关内容,已被234网友关注,下面的电子资料对本篇知识点有更加详尽的解释。

参考资料

正文内容

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

需求:序列化外键,获取外键的除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序列化外键获取外键的值方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

相关教程

  • Django框架使用内置方法实现登录的代码示范

    这篇文章主要介绍了Django框架使用内置方法实现登录功能,结合实例形式详细分析了Django框架内置方法实现登录功能的相关操作技巧与使用注意事项,需要的朋友可以参考下

    发布时间:2020-01-17

  • django组合搜索的实现过程

    这篇文章主要介绍了django组合搜索实现过程详解(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    发布时间:2020-06-11

  • python django 原生sql 获取数据的方法分享

    今天小编就为大家分享一篇python django 原生sql 获取数据的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    发布时间:2021-05-06

  • Django URL传递参数实例代码

    这篇文章主要介绍了Django URL传递参数的方法总结,需要的朋友可以参考下

    发布时间:2020-01-25

  • django模型层多表操作的知识点分享

    ​本篇文章给大家带来的内容是关于django模型层之多表操作的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    发布时间:2020-02-19

  • Django缓存之配置Redis

    这篇文章主要介绍了Django 缓存配置Redis使用详解,缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有用户来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内

    发布时间:2020-02-29

  • Django uwsgi配置 django日志文件的处理方法

    今天小编就为大家分享一篇Django使用uwsgi部署时的配置以及django日志文件的处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    发布时间:2020-01-17

  • Python通过pip安装Django步骤代码

    这篇文章主要介绍了Python 通过pip安装Django详细介绍的相关资料,需要的朋友可以参考下

    发布时间:2020-01-25

  • django send_mail功能的实例用法

    这篇文章主要给大家介绍了关于django中send_mail功能实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习

    发布时间:2019-08-30

  • 分享Django ManyToManyField 跨越中间表查询方法

    今天小编就为大家分享一篇Django ManyToManyField 跨越中间表查询的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    发布时间:2020-02-17

  • 精通Django

    精通Django

    本书的主要目的是把你打造成 Django 专家。本书集中讲解两方面的内容。首先,深入说明 Django 的机制,教你使用它构建 Web 应用。其次,适当讨论高级概念,说明如何在项目中有效使用相关的

    大小:7.5 MBDjango电子书

  • Django开发宝典

    Django开发宝典

    本书是对Python Django开发全过程解析,使读者能够掌握项目的开发流程。由浅入深地带领读者进行Django的开发,最终使读者掌握项目的开发流程,从而运用于自己的项目开发中

    大小:85.5 MBDjango电子书

  • Python新手使用Django架站的16堂课

    Python新手使用Django架站的16堂课

    本书作者台湾大师带你活用Django Web Framework快速构建移动网站,以16堂课来介绍Python新手使用Django架站的要点,可作为Python Django的初学者的参考书籍

    大小:199.5 MBPython电子书

  • Django2.2 官方文档

    Django2.2 官方文档

    Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVT的软件设计模式,即模型Model,视图View和模板Template。 Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发。通过手把手地方式教你一步步的创建一个 Web 应用。如果你初学 Django 或编程,请从这里开始。 如果你初次了解 Python,可能想

    大小:11 MBDjango

  • 玩转Django 2.0

    玩转Django 2.0

    这书全部编程代码均在Python3.6Django2.0自然环境下产品测试,出示案例源代码下载。这书是1本PythonWeb的技术总结,关键以Python3和Django2.0版本号保持。根据这书的学习培训,用户可以深入把握Dj

    大小:64.9 MBDjango电子书

用户留言