成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

假設(shè)我們定義三張數(shù)據(jù)表,分別是問卷,問題,選項。一張問卷包含不同的問題,一個問題可以設(shè)置不同的選項,自定義的接口可以實現(xiàn)查看所有或單個問卷的標(biāo)題與id,可以查看所有或單個問題的所屬問卷,問題標(biāo)題,問卷的選項。

1.定義我們需要的模型類,并且在對應(yīng)的模型類中定義對應(yīng)的將對象轉(zhuǎn)化為字典的函數(shù)

from django.db import models class Questionnaire(models.Model): ’’’問卷’’’ title = models.CharField(’標(biāo)題’,max_length=100) class Meta: verbose_name_plural = ’所有問卷’ def questionnaire_to_dict(self): ’’’把questionnaire對象轉(zhuǎn)化為字典’’’ 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’) #問題標(biāo)題 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對象轉(zhuǎn)化為字典’’’ 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(’選項內(nèi)容’,max_length=150) class Meta: verbose_name_plural = ’問題選項’ def choice_to_dict(self): ’’’把choice對象轉(zhuǎn)化為字典’’’ #選項id,選項所屬的問題id,選項內(nèi)容 return dict(id=self.id,question_id=self.question.id,content=self.content) def __str__(self): return self.content

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

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方法處理請求,首先獲取到所有的問卷對象,在將每一個問卷對象通過自定義的函數(shù)轉(zhuǎn)化為字典,最后返回json數(shù)據(jù),同樣處理post請求添加問卷時,首先獲取到問卷的標(biāo)題,然后實例化一個問卷的對象,再將問卷對象保存。獲取單個問卷對象通過傳遞的id查看到指定的問卷對象,再通過自定義的函數(shù)將對象轉(zhuǎn)化為字典數(shù)據(jù),最后返回單個問卷對象的json數(shù)據(jù)。

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

class Questions(View): def get(self,request): #查詢所有問題 questions_set = Question.objects.all() #把question_set轉(zhuǎn)化為字典 data = [] for question in questions_set: data.append(question.question_to_dict()) #把字典數(shù)據(jù)當(dāng)做json返回 return JsonResponse({’data’:data}) def post(self,request,*args,**kwargs): ’’’假設(shè)前端通過post傳過來一個json數(shù)據(jù)’’’ #把request中的json轉(zhuǎn)化為python對象 data = json.loads(request.body.decode()) #抽取數(shù)據(jù) questionnaire_id = data.get(’questionnaire_id’) title = data.get(’title’) is_checkbox = data.get(’is_checkbox’) # 獲取questionnaire_id對應(yīng)的對象 questionnaire = Questionnaire.objects.get(id=questionnaire_id) #創(chuàng)建Question實例 question = Question(title=title,is_checkbox=is_checkbox,questionnaire=questionnaire) question.save() #創(chuàng)建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數(shù)據(jù),通過post方法從前端獲取到傳遞過來的json數(shù)據(jù),將其轉(zhuǎn)化為對象并保存。并在保存成功之后返回提示信息。

(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的數(shù)據(jù) 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方法修改某個對象的數(shù)據(jù),使用put請求,將需要修改的數(shù)據(jù)寫成json格式,并把修改后的數(shù)據(jù)重新賦值給對象,然后保存。

3.配置url,調(diào)用接口

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來快速開發(fā)接口,下面是使用restframework來開發(fā)接口的代碼

1.創(chuàng)建對應(yīng)的序列化類

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開發(fā)接口雖然快速,代碼易懂,但是它的缺點在于通過序列化類只能返回這個模型類本身的字段,并不能返回它所關(guān)聯(lián)的外鍵屬性的字段,要想獲取其他關(guān)聯(lián)模型類的數(shù)據(jù)就得定義另外的類視圖,那么對應(yīng)的url也需要配置。但是同樣它的好處在于快速,代碼簡潔易懂,只不過是獲取不同模型類的數(shù)據(jù)需要定義不同的接口,不能像自定義接口那樣定義一個接口可以獲得其他模型類的數(shù)據(jù)。

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

標(biāo)簽: Django
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久久久久久久97黄色工厂| 91尤物视频在线观看| 国产一区二区h| 日本高清不卡aⅴ免费网站| 亚洲综合激情网| 亚洲午夜黄色| 久久婷婷色综合| 成人国产一区二区三区精品| 91精品国产欧美一区二区成人| 久久se这里有精品| 欧美日韩国产一二三| 国产一区二区0| 日韩视频免费观看高清完整版在线观看 | 国产一区二区影院| 在线观看成人免费视频| 日韩高清在线观看| 91传媒视频在线播放| 老鸭窝一区二区久久精品| 色狠狠色狠狠综合| 蜜臀久久久久久久| 欧美视频中文字幕| 国产一区二区三区免费观看| 制服丝袜中文字幕亚洲| 成人免费视频视频| 国产日韩欧美精品电影三级在线| 欧美+亚洲+精品+三区| 中文字幕欧美日本乱码一线二线| 欧美 日韩 国产在线| 国产精品久久一卡二卡| 亚洲国产专区校园欧美| 亚洲黄色片在线观看| 国产日韩一区二区三区| 亚洲成人精品影院| 久久综合九色综合欧美狠狠| 日本不卡1234视频| 欧美理论电影在线| 不卡的电影网站| 国产拍欧美日韩视频二区| 怡红院精品视频在线观看极品| 亚洲精品videosex极品| 色天使色偷偷av一区二区| 精品一区二区三区久久| 精品久久久久久久人人人人传媒 | 亚洲成人精品一区| 在线观看国产一区二区| 国产精品一区专区| 国产午夜精品福利| 中文日韩欧美| 青青国产91久久久久久| 91麻豆精品国产91久久久久久| jlzzjlzz国产精品久久| 亚洲日本一区二区| 久久久久久自在自线| 国产美女娇喘av呻吟久久| 精品国产免费一区二区三区香蕉| 国产精品国产三级国产专区53| 亚洲色图色小说| 在线看日本不卡| 国产99久久久国产精品免费看 | 日韩av在线免费观看不卡| 欧美日本韩国一区二区三区视频 | 国产精品日韩一区二区| 久久精品国产77777蜜臀| 精品久久久久一区二区国产| 亚洲激情女人| 捆绑紧缚一区二区三区视频 | 亚洲丶国产丶欧美一区二区三区| 欧美私模裸体表演在线观看| 91在线你懂得| 亚洲国产婷婷综合在线精品| 欧美三级日本三级少妇99| 91麻豆6部合集magnet| 亚洲资源中文字幕| 91麻豆精品国产91久久久久| 亚洲婷婷在线| 裸体歌舞表演一区二区| 国产日产欧美一区二区三区| 久久另类ts人妖一区二区| 成人免费视频caoporn| 亚洲伦理在线免费看| 91麻豆精品国产91久久久久| 亚洲大胆av| 精品无码三级在线观看视频| 国产午夜亚洲精品不卡| 可以免费看不卡的av网站| 成人av在线资源网站| 亚洲高清不卡在线| 久久综合九色综合久久久精品综合 | 国内一区二区三区| 免费观看在线色综合| 日本一区二区高清| 欧美日韩免费在线视频| 欧美激情精品久久久六区热门| 午夜伦欧美伦电影理论片| 26uuu国产在线精品一区二区| 国产精品视频久久一区| 成人免费电影视频| 亚洲chinese男男1069| 国产亚洲欧美在线| 欧美综合久久久| 欧美日韩亚洲一区二区三区四区| 日韩激情在线观看| 国产精品免费av| 6080午夜不卡| 久久av最新网址| 92国产精品观看| 美女高潮久久久| 亚洲欧美色综合| 日韩免费看的电影| 久久亚洲高清| 国产在线日韩| 成人一区二区视频| 午夜欧美在线一二页| 国产欧美一区二区精品性色超碰 | 亚洲.国产.中文慕字在线| 亚洲精品在线电影| 在线免费视频一区二区| 亚洲国产精选| 99综合影院在线| 久久成人久久爱| 亚洲资源在线观看| 欧美国产禁国产网站cc| 91精品国产91热久久久做人人| 国产麻豆综合| 亚洲欧美一区二区原创| 国产一区二区美女诱惑| 午夜视黄欧洲亚洲| 亚洲色图欧美在线| 久久精品亚洲国产奇米99| 这里只有精品电影| 色婷婷久久综合| 国产亚洲精品久久飘花| 欧美在线视屏| 国产河南妇女毛片精品久久久| 午夜精品123| 亚洲精品日产精品乱码不卡| 久久久噜噜噜久久中文字幕色伊伊| 欧美精品欧美精品系列| 91传媒视频在线播放| 免费在线一区二区| 99在线精品免费视频九九视| 欧美精品综合| av中文字幕不卡| 国产伦精品一区二区三区免费 | 在线免费观看日本欧美| 国产欧美日韩综合一区在线观看| 欧美一区国产在线| 不卡一区在线观看| 国产精品一区二区三区99| 日韩1区2区日韩1区2区| 亚洲一区在线观看免费观看电影高清| 国产精品麻豆久久久| 国产亚洲成av人在线观看导航| 欧美videossexotv100| 欧美麻豆精品久久久久久| 日本丶国产丶欧美色综合| 六月天综合网| 国产精品一区免费观看| 亚洲毛片播放| 亚洲国产免费看| 伊人激情综合| 国内精品久久久久久久97牛牛| 欧美在线一二三区| 欧美激情无毛| 国产精品a级| 国内揄拍国内精品久久| 欧美1区2区3区| 欧美日韩一区二区三区在线观看免| 欧美1区免费| 国产精品va| 亚洲国产1区| 正在播放亚洲| 先锋影音国产一区| 奶水喷射视频一区| 色综合久久99| 色婷婷综合视频在线观看| 色天天综合色天天久久| 91国产丝袜在线播放| 精品视频一区二区三区免费| 欧美日韩精品一区视频| 制服丝袜成人动漫| 欧美刺激午夜性久久久久久久| 日韩欧美自拍偷拍| 精品动漫一区二区三区在线观看| 久久综合视频网| 国产精品欧美久久久久无广告| 国产精品第五页| 亚洲综合久久久| 日本aⅴ免费视频一区二区三区| 日本v片在线高清不卡在线观看| 男女男精品视频网| 国产在线视频一区二区三区| 国产成人夜色高潮福利影视| 99在线热播精品免费| 欧美日韩第一区| 99国产精品99久久久久久粉嫩| 国产精品资源| 欧美影院午夜播放| 欧美一区二区三区白人| 久久婷婷成人综合色|