Django REST Framework序列化外鍵獲取外鍵的值方法
需求:序列化外鍵,獲取外鍵的除id之外的值
使用Django REST Framework雖然開發(fā)接口快速,但是如果想要獲取到除外鍵id值之外的外鍵信息,直接繼承serializers.ModelSerializer類,然后在fields中指定返回的字段是獲取不到外鍵的其他值的,比如我現(xiàn)在需要外鍵的name屬性值,下面就給大家介紹兩種方法通過(guò)序列化外鍵來(lái)獲取我們想要的外鍵的值。
這里有兩個(gè)Model:?jiǎn)柧?Questionnaire);問(wèn)題(Question)。一張問(wèn)卷中包含多個(gè)問(wèn)題,問(wèn)題通過(guò)外鍵關(guān)聯(lián)對(duì)應(yīng)的問(wèn)卷。
model.py
class Questionnaire(models.Model):
'''問(wèn)卷'''
title = models.CharField('標(biāo)題',max_length=100)
class Meta:
verbose_name_plural = '所有問(wèn)卷'
class Question(models.Model):
'''問(wèn)題'''
#所屬問(wèn)卷
questionnaire = models.ForeignKey(Questionnaire,verbose_name='所屬問(wèn)卷',related_name='questions')
#問(wèn)題標(biāo)題
title = models.CharField('問(wèn)題',max_length=150)
#是否是多選
is_checkbox = models.BooleanField('是否多選',default=False,help_text='是否是多選問(wèn)題')
class Meta:
verbose_name_plural = '問(wèn)題'
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')
這是沒(méi)有對(duì)外鍵進(jìn)行序列化的代碼,我們只能獲得model中已有字段的值,那么現(xiàn)在我想通過(guò)QuestionSerializer這個(gè)序列化的類來(lái)得到其外鍵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之所以沒(méi)有添加source=這個(gè)屬性,是因?yàn)檫@個(gè)字段名跟model中的字段名一樣,django會(huì)自動(dòng)識(shí)別,如果把這個(gè)字段換為questionnaire_ID那么就需要設(shè)置source=這個(gè)屬性。
2.直接在model中通過(guò)property裝飾器創(chuàng)建一個(gè)名為questionnaire_title的函數(shù),并在函數(shù)中返回我們想要拿到的信息如:questionnaire_name,questionnaire_id,然后在序列化時(shí)指定為ReadOnlyField()字段;具體操作如下
models.py
class Questionnaire(models.Model):
'''問(wèn)卷'''
title = models.CharField('標(biāo)題',max_length=100)
class Meta:
verbose_name_plural = '所有問(wèn)卷'
class Question(models.Model):
'''問(wèn)題'''
#所屬問(wèn)卷
questionnaire = models.ForeignKey(Questionnaire,verbose_name='所屬問(wèn)卷',related_name='questions')
#問(wèn)題標(biāo)題
title = models.CharField('問(wèn)題',max_length=150)
#是否是多選
is_checkbox = models.BooleanField('是否多選',default=False,help_text='是否是多選問(wèn)題')
class Meta:
verbose_name_plural = '問(wèn)題'
@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')
這就是通過(guò)序列化外鍵來(lái)獲得外鍵信息的兩種方法,總的來(lái)說(shuō)兩種方法都特別簡(jiǎn)單實(shí)用,只不過(guò)第二種方法要多寫幾行代碼而已。
以上這篇Django REST Framework序列化外鍵獲取外鍵的值方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
好用的Python編輯器WingIDE的使用經(jīng)驗(yàn)總結(jié)
WingIDE是個(gè)專為python程序語(yǔ)言設(shè)計(jì)的集成開發(fā)環(huán)境。從1999年起,Wingware公司便開始專注于python開發(fā),目前WingIDE已經(jīng)是著名的python開發(fā)框架,面向項(xiàng)目風(fēng)格的 IDE 對(duì)于大型產(chǎn)品非常有用, 是個(gè)很有前途的開發(fā)環(huán)境。2016-08-08
Python3.6中Twisted模塊安裝的問(wèn)題與解決
這篇文章主要介紹了Python3.6中Twisted模塊安裝的問(wèn)題與解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
python pygame實(shí)現(xiàn)五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了python pygame實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
純python實(shí)現(xiàn)機(jī)器學(xué)習(xí)之kNN算法示例
本篇文章主要介紹了純python實(shí)現(xiàn)機(jī)器學(xué)習(xí)之kNN算法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Python3實(shí)現(xiàn)轉(zhuǎn)換Image圖片格式
本篇文章給大家分享了Python3實(shí)現(xiàn)在線轉(zhuǎn)換Image圖片格式的功能以及相關(guān)實(shí)例代碼,有興趣的朋友參考下。2018-06-06
在 Jupyter 中重新導(dǎo)入特定的 Python 文件(場(chǎng)景分析)
Jupyter 是數(shù)據(jù)分析領(lǐng)域非常有名的開發(fā)環(huán)境,使用 Jupyter 寫數(shù)據(jù)分析相關(guān)的代碼會(huì)大大節(jié)約開發(fā)時(shí)間。這篇文章主要介紹了在 Jupyter 中如何重新導(dǎo)入特定的 Python 文件,需要的朋友可以參考下2019-10-10
python list元素為tuple時(shí)的排序方法
下面小編就為大家分享一篇python list元素為tuple時(shí)的排序方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python獲取時(shí)間及時(shí)間格式轉(zhuǎn)換問(wèn)題實(shí)例代碼詳解
這篇文章主要介紹了python獲取時(shí)間及時(shí)間格式轉(zhuǎn)換,需要的朋友可以參考下2018-12-12
Python利用pandas對(duì)數(shù)據(jù)進(jìn)行特定排序
本文主要介紹了Python利用pandas對(duì)數(shù)據(jù)進(jìn)行特定排序,主要使用?pandas.DataFrame.sort_values?方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03

