Django REST Framework序列化外鍵獲取外鍵的值方法
需求:序列化外鍵,獲取外鍵的除id之外的值
使用Django REST Framework雖然開(kāi)發(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ò)第二種方法要多寫(xiě)幾行代碼而已。
以上這篇Django REST Framework序列化外鍵獲取外鍵的值方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章

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

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

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

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