欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年07月15日 08:42:12   作者:學(xué)習(xí)真的很有用  
這篇文章主要介紹了淺談django不使用restframework自定義接口與使用的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

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

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

1.定義我們需要的模型類,并且在對(duì)應(yīng)的模型類中定義對(duì)應(yīng)的將對(duì)象轉(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對(duì)象轉(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對(duì)象轉(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):
 '''選項(xiàng)'''
 #所屬的問題
 question = models.ForeignKey(Question,verbose_name='所屬問題',related_name='choices')
 content = models.CharField('選項(xiàng)內(nèi)容',max_length=150)
 
 class Meta:
 verbose_name_plural = '問題選項(xiàng)'
 
 def choice_to_dict(self):
 '''把choice對(duì)象轉(zhuǎn)化為字典'''
 #選項(xiàng)id,選項(xiàng)所屬的問題id,選項(xiàng)內(nèi)容
 return dict(id=self.id,question_id=self.question.id,content=self.content)
 
 def __str__(self):
 return self.content

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

2.定義類視圖

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

from question.models import Question,Questionnaire,Choice
from django.http import JsonResponse
from django.views import View
import json
class 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方法處理請(qǐng)求,首先獲取到所有的問卷對(duì)象,在將每一個(gè)問卷對(duì)象通過自定義的函數(shù)轉(zhuǎn)化為字典,最后返回json數(shù)據(jù),同樣處理post請(qǐng)求添加問卷時(shí),首先獲取到問卷的標(biāo)題,然后實(shí)例化一個(gè)問卷的對(duì)象,再將問卷對(duì)象保存。獲取單個(gè)問卷對(duì)象通過傳遞的id查看到指定的問卷對(duì)象,再通過自定義的函數(shù)將對(duì)象轉(zhuǎn)化為字典數(shù)據(jù),最后返回單個(gè)問卷對(duì)象的json數(shù)據(jù)。

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

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傳過來一個(gè)json數(shù)據(jù)'''
 #把request中的json轉(zhuǎn)化為python對(duì)象
 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對(duì)應(yīng)的對(duì)象
 questionnaire = Questionnaire.objects.get(id=questionnaire_id)
 #創(chuàng)建Question實(shí)例
 question = Question(title=title,is_checkbox=is_checkbox,questionnaire=questionnaire)
 question.save()
 #創(chuàng)建choice對(duì)象
 choices = data.get('choice')
 for c in choices:
  choice = Choice()
  choice.content = c
  choice.question = question
  choice.save()
 return JsonResponse({"msg":"success save"})

通過get請(qǐng)求來獲取所有問題的json數(shù)據(jù),通過post方法從前端獲取到傳遞過來的json數(shù)據(jù),將其轉(zhuǎn)化為對(duì)象并保存。并在保存成功之后返回提示信息。

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

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對(duì)象
 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)

這里難點(diǎn)是使用put方法修改某個(gè)對(duì)象的數(shù)據(jù),使用put請(qǐng)求,將需要修改的數(shù)據(jù)寫成json格式,并把修改后的數(shù)據(jù)重新賦值給對(duì)象,然后保存。

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

from django.conf.urls import url
from question.views import Questions,Questionnaires,QuestionDetail,QuestionnaireDetail
urlpatterns = [
 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)建對(duì)應(yīng)的序列化類

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):
 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 url
from question.views import Questionnaire_Detail,QuestionnaireList,QuestionList
urlpatterns = [
 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'),
]

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

以上這篇淺談django不使用restframework自定義接口與使用的區(qū)別就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Pycharm遠(yuǎn)程調(diào)試和MySQL數(shù)據(jù)庫(kù)授權(quán)問題

    Pycharm遠(yuǎn)程調(diào)試和MySQL數(shù)據(jù)庫(kù)授權(quán)問題

    這篇文章主要介紹了Pycharm遠(yuǎn)程調(diào)試和MySQL數(shù)據(jù)庫(kù)授權(quán)問題,文章內(nèi)容介紹詳細(xì),需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)或工作有所幫助
    2022-03-03
  • Python?queue雙端隊(duì)列模塊及用法小結(jié)

    Python?queue雙端隊(duì)列模塊及用法小結(jié)

    雙端隊(duì)列是一種具有隊(duì)列和棧性質(zhì)的線性數(shù)據(jù)結(jié)構(gòu),本文主要介紹了Python?queue雙端隊(duì)列模塊及用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Python實(shí)現(xiàn)數(shù)據(jù)濾波的示例詳解

    Python實(shí)現(xiàn)數(shù)據(jù)濾波的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)數(shù)據(jù)濾波的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 用python建立兩個(gè)Y軸的XY曲線圖方法

    用python建立兩個(gè)Y軸的XY曲線圖方法

    今天小編就為大家分享一篇用python建立兩個(gè)Y軸的XY曲線圖方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 詳解appium自動(dòng)化測(cè)試工具(monitor、uiautomatorviewer)

    詳解appium自動(dòng)化測(cè)試工具(monitor、uiautomatorviewer)

    這篇文章主要介紹了詳解appium自動(dòng)化測(cè)試工具(monitor、uiautomatorviewer),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python Socket TCP雙端聊天功能實(shí)現(xiàn)過程詳解

    Python Socket TCP雙端聊天功能實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Python Socket TCP雙端聊天功能實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python程序變成軟件的實(shí)操方法

    python程序變成軟件的實(shí)操方法

    在本篇文章里小編給大家整理的是關(guān)于python程序變成軟件的相關(guān)方法和具體操作流程,有需要的朋友們可以參考下。
    2019-06-06
  • 爬蟲代理池Python3WebSpider源代碼測(cè)試過程解析

    爬蟲代理池Python3WebSpider源代碼測(cè)試過程解析

    這篇文章主要介紹了爬蟲代理池Python3WebSpider源代碼測(cè)試過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • PyTorch上實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)CNN的方法

    PyTorch上實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)CNN的方法

    本篇文章主要介紹了PyTorch上實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)CNN的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • Python技法之簡(jiǎn)單遞歸下降Parser的實(shí)現(xiàn)方法

    Python技法之簡(jiǎn)單遞歸下降Parser的實(shí)現(xiàn)方法

    遞歸下降解析器可以用來實(shí)現(xiàn)非常復(fù)雜的解析,下面這篇文章主要給大家介紹了關(guān)于Python技法之簡(jiǎn)單遞歸下降Parser的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評(píng)論