电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:190日期: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
相關文章:
主站蜘蛛池模板: 布袋式除尘器|木工除尘器|螺旋输送机|斗式提升机|刮板输送机|除尘器配件-泊头市德佳环保设备 | 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 高压贴片电容|贴片安规电容|三端滤波器|风华电容代理南京南山 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | NBA直播_NBA直播免费观看直播在线_NBA直播免费高清无插件在线观看-24直播网 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 欧景装饰设计工程有限公司-无锡欧景装饰官网 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 北京发电机出租_发电机租赁_北京发电机维修 - 河北腾伦发电机出租 | 合肥花魁情感婚姻咨询中心_挽回爱情_修复婚姻_恋爱指南 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 深圳希玛林顺潮眼科医院(官网)│深圳眼科医院│医保定点│香港希玛林顺潮眼科中心连锁品牌 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 游戏版号转让_游戏资质出售_游戏公司转让-【八九买卖网】 | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 广州工业氧气-工业氩气-工业氮气-二氧化碳-广州市番禺区得力气体经营部 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 无锡不干胶标签,卷筒标签,无锡瑞彩包装材料有限公司 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 赛尔特智能移动阳光房-阳光房厂家-赛尔特建筑科技(广东)有限公司 | 熔体泵|换网器|熔体齿轮泵|熔体计量泵厂家-郑州巴特熔体泵有限公司 | 滚塑PE壳体-PE塑料浮球-警示PE浮筒-宁波君益塑业有限公司 | 单机除尘器 骨架-脉冲除尘器设备生产厂家-润天环保设备 | 打造全球沸石生态圈 - 国投盛世| 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-沼河浸过滤器 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 |