1. 程式人生 > >Vue與Django資料互動

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預設會判斷這是否為一個方法,是則新增括號執行。