日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

淺談django不使用restframework自定義接口與使用的區別

瀏覽:462日期:2024-09-26 13:32:18

django可以使用restframework快速開發接口,返回前端所需要的json數據,但是有時候利用restframework開發的接口并不能滿足所有的需求,這時候就需要自己手動開發接口,也就是將需要用到的某些對象轉化為需要使用的json數據,今天記錄一下django自己定義接口的一種方法與思路

假設我們定義三張數據表,分別是問卷,問題,選項。一張問卷包含不同的問題,一個問題可以設置不同的選項,自定義的接口可以實現查看所有或單個問卷的標題與id,可以查看所有或單個問題的所屬問卷,問題標題,問卷的選項。

1.定義我們需要的模型類,并且在對應的模型類中定義對應的將對象轉化為字典的函數

from django.db import models class Questionnaire(models.Model): ’’’問卷’’’ title = models.CharField(’標題’,max_length=100) class Meta: verbose_name_plural = ’所有問卷’ def questionnaire_to_dict(self): ’’’把questionnaire對象轉化為字典’’’ return dict(questionnaire_id=self.id,title=self.title,questions=[question.question_to_dict() for question in self.questions.all()]) def __str__(self): return self.title 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 = ’問題’ def question_to_dict(self): ’’’把question對象轉化為字典’’’ return dict(title=self.title,choice=[choice.choice_to_dict() for choice in self.choices.all()], is_checkbox=self.is_checkbox,questionnaire_id=self.questionnaire.id) def __str__(self): return self.title class Choice(models.Model): ’’’選項’’’ #所屬的問題 question = models.ForeignKey(Question,verbose_name=’所屬問題’,related_name=’choices’) content = models.CharField(’選項內容’,max_length=150) class Meta: verbose_name_plural = ’問題選項’ def choice_to_dict(self): ’’’把choice對象轉化為字典’’’ #選項id,選項所屬的問題id,選項內容 return dict(id=self.id,question_id=self.question.id,content=self.content) def __str__(self): return self.content

將你需要轉化為字典的字段添加進函數中,當指定外鍵時,'related_name'為指定關系名,用于反向查找,比如通過問卷查找問題,但是問卷模型類中沒有question字段,但是question類中指定questionnaire外鍵時指定了關系名related_name=’questions’所以可以通過self.questions.all()來查看當前問卷的所有問題。

2.定義類視圖

(1)定義查看所有問卷與添加問卷的類視圖

from question.models import Question,Questionnaire,Choicefrom django.http import JsonResponsefrom django.views import Viewimport jsonclass Questionnaires(View): def get(self,request): #獲取所有問卷 data = [] questionnaires = Questionnaire.objects.all() #獲取所有的問卷類 for questionnaire in questionnaires: data.append(questionnaire.questionnaire_to_dict()) return JsonResponse({’data’:data}) def post(self,request,*args,**kwargs): data = json.loads(request.body.decode()) questionnaire = Questionnaire(title=data.get(’title’)) questionnaire.save() return JsonResponse({’msg’:’success save’}) class QuestionnaireDetail(View): ’’’獲取id為questionnaire_id的問卷’’’ def get(self,request,questionnaire_id): questionnaire = Questionnaire.objects.get(id=questionnaire_id) data = questionnaire.questionnaire_to_dict() return JsonResponse(data)

這里繼承View類自己定義get方法與post方法處理請求,首先獲取到所有的問卷對象,在將每一個問卷對象通過自定義的函數轉化為字典,最后返回json數據,同樣處理post請求添加問卷時,首先獲取到問卷的標題,然后實例化一個問卷的對象,再將問卷對象保存。獲取單個問卷對象通過傳遞的id查看到指定的問卷對象,再通過自定義的函數將對象轉化為字典數據,最后返回單個問卷對象的json數據。

(2)獲取所有問題對象數據,及添加問題對象

class Questions(View): def get(self,request): #查詢所有問題 questions_set = Question.objects.all() #把question_set轉化為字典 data = [] for question in questions_set: data.append(question.question_to_dict()) #把字典數據當做json返回 return JsonResponse({’data’:data}) def post(self,request,*args,**kwargs): ’’’假設前端通過post傳過來一個json數據’’’ #把request中的json轉化為python對象 data = json.loads(request.body.decode()) #抽取數據 questionnaire_id = data.get(’questionnaire_id’) title = data.get(’title’) is_checkbox = data.get(’is_checkbox’) # 獲取questionnaire_id對應的對象 questionnaire = Questionnaire.objects.get(id=questionnaire_id) #創建Question實例 question = Question(title=title,is_checkbox=is_checkbox,questionnaire=questionnaire) question.save() #創建choice對象 choices = data.get(’choice’) for c in choices: choice = Choice() choice.content = c choice.question = question choice.save() return JsonResponse({'msg':'success save'})

通過get請求來獲取所有問題的json數據,通過post方法從前端獲取到傳遞過來的json數據,將其轉化為對象并保存。并在保存成功之后返回提示信息。

(3)通過get,put,delete處理單個問題對象

class QuestionDetail(View): def delete(self,request,question_id): question = Question.objects.get(id=question_id) question.delete() def put(self,request,question_id): #獲取前端put的數據 data = json.loads(request.body.decode()) title = data.get(’title’) #獲取question對象 question = Question.objects.get(id=question_id) question.title = title question.save() return JsonResponse({’msg’:’modify success’}) def get(self,request,question_id): question = Question.objects.get(id=question_id) data = question.question_to_dict() return JsonResponse(data)

這里難點是使用put方法修改某個對象的數據,使用put請求,將需要修改的數據寫成json格式,并把修改后的數據重新賦值給對象,然后保存。

3.配置url,調用接口

from django.conf.urls import urlfrom question.views import Questions,Questionnaires,QuestionDetail,QuestionnaireDetailurlpatterns = [ url(r’^questions/$’,Questions.as_view(),name=’questions’), url(r’^questionnaire/(?P<questionnaire_id>d+)/$’,QuestionnaireDetail.as_view(),name=’questionnaire’), url(r’^questionnaires/$’,Questionnaires.as_view(),name=’questionnaires’), url(r’^question/(?P<question_id>d+)/$’,QuestionDetail.as_view(),name=’question’),]

同樣,我們可以使用restframework來快速開發接口,下面是使用restframework來開發接口的代碼

1.創建對應的序列化類

from rest_framework import serializersfrom question.models import Question,Questionnaire,Choice class QuestionnaireSerializer(serializers.ModelSerializer): class Meta: model = Questionnaire fields = (’title’,) class QuestionSerializer(serializers.ModelSerializer): class Meta: model = Question fields = (’title’,’is_checkbox’,’questionnaire’) class ChoiceSerializer(serializers.ModelSerializer): class Meta: model = Choice fields = (’content’,’question’)

使用這些序列化類來序列化我們需要的字段

2.定義類視圖

class QuestionnaireList(APIView): def get(self,request): questionnaire = Questionnaire.objects.all() serializer = QuestionnaireSerializer(questionnaire,many=True) return Response(serializer.data) def post(self,request): serializer = QuestionnaireSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors) class Questionnaire_Detail(APIView): def get_object(self,pk): try: return Questionnaire.objects.get(pk=pk) except Questionnaire.DoesNotExist: raise Http404 def get(self,request,pk): questionnaire = self.get_object(pk) serializer = QuestionnaireSerializer(questionnaire) return Response(serializer.data) def put(self,request,pk): questionnaire = self.get_object(pk) serializer = QuestionSerializer(questionnaire,data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors) def delete(self,request,pk): questionnaire = self.get_object(pk) questionnaire.delete() return Response(status=status.HTTP_204_NO_CONTENT) class QuestionList(APIView): def get(self,request): question = Question.objects.all() serializer = QuestionSerializer(question,many=True) return Response(serializer.data) def post(self,request): serializer = QuestionSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors)

3.配置url

from django.conf.urls import urlfrom question.views import Questionnaire_Detail,QuestionnaireList,QuestionListurlpatterns = [ url(r’^questions/$’,QuestionList.as_view(),name=’questions’), url(r’^questionnaire/(?P<pk>d+)/$’,Questionnaire_Detail.as_view(),name=’questionnaire’), url(r’^questionnaires/$’,QuestionnaireList.as_view(),name=’questionnaires’),]

這里我只定義了獲取所有問卷,單個問卷及所有問題的類,使用restframework開發接口雖然快速,代碼易懂,但是它的缺點在于通過序列化類只能返回這個模型類本身的字段,并不能返回它所關聯的外鍵屬性的字段,要想獲取其他關聯模型類的數據就得定義另外的類視圖,那么對應的url也需要配置。但是同樣它的好處在于快速,代碼簡潔易懂,只不過是獲取不同模型類的數據需要定義不同的接口,不能像自定義接口那樣定義一個接口可以獲得其他模型類的數據。

以上這篇淺談django不使用restframework自定義接口與使用的區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲人成在线网站| 欧美日韩99| 国产色噜噜噜91在线精品| 日本久久成人网| 精品三级av| 鲁大师精品99久久久| 欧美日韩va| 免费亚洲一区| 日韩在线短视频| 久久精品国产www456c0m| 99视频精品视频高清免费| 久久久水蜜桃av免费网站| 成人精品天堂一区二区三区| 欧美高清不卡| 亚洲久草在线| 欧美亚洲免费| 精品日韩在线| 9久re热视频在线精品| 亚洲欧美成人综合| 日韩精品免费一区二区夜夜嗨| 日韩激情一区二区| 国产免费av国片精品草莓男男| 97精品中文字幕| 女人天堂亚洲aⅴ在线观看| 亚洲区国产区| 久久99国产精品视频| 亚洲国产综合在线看不卡| 少妇精品久久久一区二区| 国产劲爆久久| 欧美日韩高清| 欧美一级一区| 不卡av一区二区| 牛牛精品成人免费视频| 黄色不卡一区| 日韩精品欧美大片| 亚洲高清av| 国产亚洲第一伦理第一区| 91精品精品| 国产精品久久久久久久久久久久久久久 | 国产欧美亚洲一区| se01亚洲视频| 国产精品v一区二区三区| 中文在线一区| 香蕉视频亚洲一级| 国产精品777777在线播放| 国产一级一区二区| 国产一区二区三区四区| 在线观看一区| 99国产精品免费视频观看| 国产激情久久| 日韩高清国产一区在线| 一区视频在线| 国产在线不卡| 麻豆精品av| 日本欧美大码aⅴ在线播放| 久久精品免费一区二区三区| 国产一区二区视频在线看| 欧美国产日韩电影| 国产精品最新| 欧美一级全黄| 91成人精品在线| 国产日韩欧美中文在线| 日本强好片久久久久久aaa| 蜜芽一区二区三区| 综合国产视频| 国产精品日韩| 在线精品视频在线观看高清| 久久精品1区| 国产精品不卡| 色在线视频观看| 成人啊v在线| 在线一区电影| 久久国产精品毛片| 日韩av影院| 日韩精品三级| 欧美经典一区| 日韩av一级| 九九综合九九| 婷婷亚洲精品| 国产精品久久乐| 岛国av在线播放| 欧美精选一区二区三区| 视频一区二区三区入口| 日韩中出av| 国产精品乱战久久久| 在线看片国产福利你懂的| 欧美日韩日本国产亚洲在线 | 特黄毛片在线观看| 欧美不卡在线| 亚洲乱码久久| 精品视频黄色| 婷婷丁香综合| 日韩中文av| 亚洲一区资源| 日本精品一区二区三区在线观看视频 | 日本精品在线播放| 成人高清一区| 日韩在线播放一区二区| 国产精品日韩精品在线播放| 欧美日韩一二三四| 国产精品自在| av亚洲免费| 国产精品啊啊啊| 99国产精品视频免费观看一公开 | 精品在线网站观看| 久久福利精品| 国产精品最新| 在线看片日韩| 在线日韩欧美| 美女毛片一区二区三区四区最新中文字幕亚洲 | 一区二区电影在线观看| 深夜视频一区二区| 国产精品极品国产中出| 欧美日韩国产免费观看| 国产一区二区精品久| 天堂久久av| 性欧美精品高清| 欧美/亚洲一区| 国产欧美日韩视频在线| 午夜欧美精品久久久久久久| 久久午夜影院| 久久不卡国产精品一区二区| 美女黄网久久| 九九久久电影| 99久久99视频只有精品| 精品国产第一福利网站| 精品三级av在线导航| 免费在线欧美黄色| 91视频一区| 国产va在线视频| 久久影院一区二区三区| 国产精品18| 国产aⅴ精品一区二区四区| 久久这里只有精品一区二区| 国产精品白丝一区二区三区| 国产精品日本一区二区不卡视频| 91精品国产自产观看在线| 日本国产欧美| 国产精品chinese| 国产成人久久精品麻豆二区| 免费视频一区二区三区在线观看 | 欧美少妇精品| 亚洲天堂黄色| 亚洲欧美激情诱惑| 日韩不卡一区二区三区| 日本91福利区| 老色鬼精品视频在线观看播放| 免费在线观看一区| 久久久久久久久丰满| 免费国产自线拍一欧美视频| 日韩av一二三| 精品国产精品国产偷麻豆| 久久中文字幕二区| 日韩精品a在线观看91| 蜜桃精品视频| 国产日韩专区| 国产精品网站在线看| 日韩一区二区在线免费| 丝袜国产日韩另类美女| 国产欧美自拍一区| 国产一区二区三区日韩精品| 久久久蜜桃一区二区人| 亚洲精品成人一区| 久久精品理论片| 久久亚洲不卡| 国产96在线亚洲| 国产精品外国| 精品少妇一区| 亚洲精品字幕| 麻豆精品蜜桃| 国产精品videossex久久发布| 久久在线电影| 国产成人免费| 日韩精品三区四区| 亚洲福利免费| 欧美专区一区| 久久麻豆精品| 日产精品一区二区| 日韩精品亚洲一区二区三区免费| 久久九九99| 日韩在线观看| 精品亚洲自拍| 国产精品久久久久久av公交车| 免费日韩一区二区| 99久久久久| 日韩中文字幕高清在线观看| 国产中文欧美日韩在线| 国产精品视频一区视频二区| 免费人成精品欧美精品| 久久亚洲成人| 卡一精品卡二卡三网站乱码| 日韩在线播放一区二区| 日韩一区二区三区在线免费观看| 国产精品九九| 麻豆视频久久| 狠狠久久伊人中文字幕| 久久爱www.| 精品99久久| 一本大道色婷婷在线| 日韩欧美字幕|