Vue與Django數據交互


首先配置路由信息,理論上都會添加二級路由:所以會有請求轉發

1 from django.conf.urls import url,include 2 
3  url(r'^api/(?P<version>\w+)/',include("api.urls")),

此時請求會轉發給二級路由:api.urls

1    url(r'^course/$',course.CourseView.as_view({"get":"list"})), 2    url(r'^course/(?P<pk>\d+)/$',course.CourseView.as_view({"get":"retrieve"})),

對應去執行相應路由的視圖類方法。

因為路由中涉及到版本配置,所以需要在Django的setting文件夾里配置rest_framework組件參數:

1 REST_FRAMEWORK = { 2     'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',], 3 
4     'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning', 5     'ALLOWED_VERSIONS':['v1','v2'], # 允許的版本
6     'VERSION_PARAM':'version', # 參數
7     'DEFAULT_VERSION':'v1', # 默認版本
8 
9 }

因為需要執行as.view()方法,所以類必須繼承含有此方法的類

 1 from rest_framework.viewsets import ViewSetMixin  2 from rest_framework.response import Response  3 from rest_framework.views import APIView  4 
 5 class CourseView(ViewSetMixin,APIView):  6 
 7     def list(self,request,*args,**kwargs):  8         """
 9  課程列表接口 10  :param request: 11  :param args: 12  :param kwargs: 13  :return: 14         """
15         ret={"code":1000,"data":None} 16         try: 17             queryset=models.Course.objects.all() 18             ser=CourseSerializer(instance=queryset,many=True) 19             ret["data"]=ser.data 20         except Exception as e: 21             ret["code"]=1001
22             ret["error"]="獲取數據失敗"
23         return Response(ret) 24 
25     def retrieve(self,request,*args,**kwargs): 26         """
27  課程詳情接口 28  :param request: 29  :param args: 30  :param kwargs: 31  :return: 32         """
33         ret = {"code": 1000, "data": None} 34         try: 35             cid=kwargs.get("pk") 36             obj = models.Course_detail.objects.filter(c_detail_id=cid).first() 37             ser = DetailCourseSerializer(instance=obj, many=False) 38             ret["data"] = ser.data 39         except Exception as e: 40             ret["code"] = 1001
41             ret["error"] = "獲取數據失敗"
42         return Response(ret)

在執行對應的路由時會分流,根據是否傳遞參數,判斷執行不同的路由。不帶參數,執行list方法,返回全部queryset數據。帶參數,執行retrieve方法,返回此obj對象的全部數據。

在訪問數據庫前,先設置其相應的狀態碼,以及數據字典鍵。在訪問數據庫后,得到一個queryset對象或者一個obj對象,需要先將queryset指定類進行序列化,才可以將序列化好的字典數據傳遞給Vue進行數據顯示。

1 from api import models
  from rest_framework import serializers
 class CourseSerializer(serializers.ModelSerializer): 2     class Meta: 3         model= models.Course 4         fields="__all__"

簡單的數據序列化,可以直接按照model里面的字段指定。

遇到較復雜的數據字段,比如需要跨表去獲取字段,則可以通過指定字段來實現,用source

 1 class DetailCourseSerializer(serializers.ModelSerializer):  2     title=serializers.CharField(source="c_detail.title")  3     course_img=serializers.CharField(source="c_detail.course_img")  4     level = serializers.CharField(source="c_detail.get_level_display")  5 
 6     related_course=serializers.SerializerMethodField()  7 
 8     class Meta:  9         model=models.Course_detail 10         fields=["title","course_img","level","slogon","reason","related_course"] 11 
12     def get_related_course(self,obj): 13         # print(type(obj))
14         queryset=obj.related_course.all() 15         return [{"id":row.id,"title":row.title}for row in queryset]

source支持一對一或者一對多的主外鍵字段跨表,但不支持多對多字段操作。

要實現多對多的字段跨表,需要自定義函數用到serializers.SerializerMethodField()這個方法。它能實現跨到另一張表去去任何字段。

如果是choice類型的數據,想獲取數值對應的值,可以get_字段名_display有時Django默認會判斷這是否為一個方法,是則添加括號執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM