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

作者:在杭州 时间:2022-02-23 16:03:14 

需求:序列化外键,获取外键的除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')

这就是通过序列化外键来获得外键信息的两种方法,总的来说两种方法都特别简单实用,只不过第二种方法要多写几行代码而已。

来源:https://blog.csdn.net/WanYu_Lss/article/details/82120259

标签:Django,REST,Framework,序列化,外键
0
投稿

猜你喜欢

  • php源码的安装方法和实例

    2023-07-06 03:31:37
  • Python进阶之列表推导与生成器表达式详解

    2022-01-18 00:07:04
  • php打印输出棋盘的实现方法

    2023-10-09 04:38:10
  • js倒计时代码

    2008-05-07 13:41:00
  • Python制作简易注册登录系统

    2022-08-25 14:46:28
  • Python基础之字典常见操作经典实例详解

    2022-09-01 15:59:18
  • asp开发中textarea常见问题

    2008-04-13 06:34:00
  • sqlserver/mysql按天、按小时、按分钟统计连续时间段数据【推荐】

    2024-01-27 14:23:20
  • SQLServer 触发器 数据库进行数据备份

    2024-01-18 10:53:20
  • Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程

    2023-01-11 13:45:04
  • 关于Python的一些学习总结

    2022-01-10 11:23:41
  • SQL Server管理 这些你懂吗?

    2011-07-01 13:40:23
  • 正解SQLSERVER 2005 sql排序(按大小排序)

    2024-01-15 18:34:36
  • Python中如何替换字典中的值

    2022-10-04 21:21:35
  • Python性能优化的20条建议

    2021-05-20 15:24:12
  • Python自动化爬取天眼查数据的实现

    2021-01-10 23:28:27
  • Oracle以逗号分隔的字符串拆分为多行数据实例详解

    2024-01-13 16:32:46
  • ASP 调用带参数输出的COM接口

    2011-03-17 10:59:00
  • 从MySQL4.0向MySQL5迁移数据

    2007-11-19 13:11:00
  • MySQL8.0的WITH查询详情

    2024-01-24 16:43:16
  • asp之家 网络编程 m.aspxhome.com