欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django REST Framework序列化外鍵獲取外鍵的值方法

 更新時(shí)間:2019年07月26日 11:21:20   作者:在杭州  
今天小編就為大家分享一篇Django REST Framework序列化外鍵獲取外鍵的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

需求:序列化外鍵,獲取外鍵的除id之外的值

使用Django REST Framework雖然開發(fā)接口快速,但是如果想要獲取到除外鍵id值之外的外鍵信息,直接繼承serializers.ModelSerializer類,然后在fields中指定返回的字段是獲取不到外鍵的其他值的,比如我現(xiàn)在需要外鍵的name屬性值,下面就給大家介紹兩種方法通過序列化外鍵來獲取我們想要的外鍵的值。

這里有兩個(gè)Model:問卷(Questionnaire);問題(Question)。一張問卷中包含多個(gè)問題,問題通過外鍵關(guān)聯(lián)對(duì)應(yīng)的問卷。

model.py

class Questionnaire(models.Model):
 '''問卷'''
 title = models.CharField('標(biāo)題',max_length=100)
 class Meta:
  verbose_name_plural = '所有問卷'
 
class Question(models.Model):
 '''問題'''
 #所屬問卷
 questionnaire = models.ForeignKey(Questionnaire,verbose_name='所屬問卷',related_name='questions')
 #問題標(biāo)題
 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')

這是沒有對(duì)外鍵進(jìn)行序列化的代碼,我們只能獲得model中已有字段的值,那么現(xiàn)在我想通過QuestionSerializer這個(gè)序列化的類來得到其外鍵questionnaire的值(questionnaire_title),有一下兩種方法實(shí)現(xiàn)

1.在序列化的時(shí)候創(chuàng)建一個(gè)新的字段(questionnaire_title)并且在這個(gè)字段中指定source=這個(gè)屬性,具體操作如下

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')

第二個(gè)字段questionnaire_id之所以沒有添加source=這個(gè)屬性,是因?yàn)檫@個(gè)字段名跟model中的字段名一樣,django會(huì)自動(dòng)識(shí)別,如果把這個(gè)字段換為questionnaire_ID那么就需要設(shè)置source=這個(gè)屬性。

2.直接在model中通過property裝飾器創(chuàng)建一個(gè)名為questionnaire_title的函數(shù),并在函數(shù)中返回我們想要拿到的信息如:questionnaire_name,questionnaire_id,然后在序列化時(shí)指定為ReadOnlyField()字段;具體操作如下

models.py

class Questionnaire(models.Model):
 '''問卷'''
 title = models.CharField('標(biāo)題',max_length=100)
 class Meta:
  verbose_name_plural = '所有問卷'
 
class Question(models.Model):
 '''問題'''
 #所屬問卷
 questionnaire = models.ForeignKey(Questionnaire,verbose_name='所屬問卷',related_name='questions')
 #問題標(biāo)題
 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')

這就是通過序列化外鍵來獲得外鍵信息的兩種方法,總的來說兩種方法都特別簡單實(shí)用,只不過第二種方法要多寫幾行代碼而已。

以上這篇Django REST Framework序列化外鍵獲取外鍵的值方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器與抽簽工具

    使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器與抽簽工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器,也可以用作抽簽工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Python 迭代器工具包【推薦】

    Python 迭代器工具包【推薦】

    迭代器工具在產(chǎn)生數(shù)據(jù)的時(shí)候?qū)?huì)顯得非常便捷、高效,掌握了這些基本的方法之后,通過簡單的組合就可以獲得更多迭代器工具。
    2016-05-05
  • 基于Python實(shí)現(xiàn)從頭搭建一個(gè)在線聊天室框架

    基于Python實(shí)現(xiàn)從頭搭建一個(gè)在線聊天室框架

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)從頭搭建一個(gè)在線聊天室框架,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • Python實(shí)現(xiàn)的建造者模式示例

    Python實(shí)現(xiàn)的建造者模式示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的建造者模式,結(jié)合完整實(shí)例形式分析了構(gòu)造者模式的具體定義與相關(guān)使用操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python實(shí)現(xiàn)順序查找的示例代碼

    Python實(shí)現(xiàn)順序查找的示例代碼

    順序查找(Sequential?Search)是一種簡單直觀的搜索算法,用于在無序數(shù)組中查找特定元素,本文將介紹順序查找的基本原理,并通過Python代碼進(jìn)行詳細(xì)講解,需要的可以參考一下
    2023-08-08
  • Python的經(jīng)緯度與xy坐標(biāo)系相互轉(zhuǎn)換方式

    Python的經(jīng)緯度與xy坐標(biāo)系相互轉(zhuǎn)換方式

    這篇文章主要介紹了Python的經(jīng)緯度與xy坐標(biāo)系相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python如何把Spark數(shù)據(jù)寫入ElasticSearch

    Python如何把Spark數(shù)據(jù)寫入ElasticSearch

    這篇文章主要介紹了Python如何把Spark數(shù)據(jù)寫入ElasticSearch,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 通過C++學(xué)習(xí)Python

    通過C++學(xué)習(xí)Python

    這篇文章主要介紹了通過C++學(xué)習(xí)Python,通過對(duì)比分析,讓我們能夠更好的學(xué)習(xí)python.
    2015-01-01
  • 最新評(píng)論