Django REST Framework序列化外鍵獲取外鍵的值方法
需求:序列化外鍵,獲取外鍵的除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)從頭搭建一個(gè)在線聊天室框架

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

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