這篇文章給大家分享的是有關Django REST Framework序列化外鍵如何獲取外鍵的值方法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
需求:序列化外鍵,獲取外鍵的除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')這就是通過序列化外鍵來獲得外鍵信息的兩種方法,總的來說兩種方法都特別簡單實用,只不過第二種方法要多寫幾行代碼而已。
感謝各位的閱讀!關于“Django REST Framework序列化外鍵如何獲取外鍵的值方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。