Vue与Django数据交互

摘要:
因为版本配置涉及路由,您需要在Djang_Framework组件参数的设置文件夹中配置rest:1REST_ Framework={2'DEFAULT_RENDERER_CLASSES':['rest_Framework.renderers.JSONRenderer','rest_fframework.renderrs.BrowsableAPIRender',],34'DEFAULT_VERSIONING_CLASS':'rest_fFramework.version.URLPathVersioning',5'ALLOWED_VERSIONS':['v1','v2'],#允许的版本6'version_PARAM':'version',#参数7'DEFAULT_version':'v1',#默认版本89}因为as。view()方法需要执行,因此类必须从包含此method_framework的rest继承类1。viewsetimportViewSetMixin2来自rest_ framework。responseimportResponse3来自rest_ framework。ViewsimpltAPIView45classCourseView:67deflist:8“”9课程列表界面10:paramrequest:11:paramargs:12:paramkwargs:13:return:14“”15ret={“code”:1000,“data”:无}16try:17queryset=models。课程物体。all()18ser=CourseSerializer19ret[“data”]=ser Data20exceptExceptionase:21ret[“code”]=100122ret[“error”]=“获取数据失败”23returnResponse2425defretrieve:26”“27课程详细信息界面28:paramrequest:29:paramargs:30:paramkwargs:31:preturn:32”“33ret={“code”:1000,“data”:无}34ry:35cid=kwargs。get36obj=模型。Source_detail.objects.filter.first()37ser=DetailCourseSerializer38ret[“data”]=ser。Data39exceptExceptionase:40ret[“code”]=100141ret[“error”]=“获取数据失败”42执行相应的路由时returnResponse将拆分。根据参数是否被传递来判断是否执行不同的路由。如果你想得到与选择类型数据的值相对应的值,你可以得到_字段名_显示有时候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默认会判断这是否为一个方法,是则添加括号执行。

免责声明:文章转载自《Vue与Django数据交互》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇咏南LINUX中间件通过命令行指定监听的IP和端口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue使用watch监听实现即时搜索功能

<template> <div> vue使用watch监听实现类似百度搜索功能 <div> <input type="text" placeholder="搜索" v-model.trim='keyword' /> </...

vue使用iframe嵌入html,js方法互调

前段时间 使用h5搞了个用cesium.js做的地图服务功能,后来想整合到vue项目,当然最简单的就是iframe直接拿来用了。但html和vue的方法交互就是成了问题,vue调用html种方法还好,尤其是html调用vue中的方法当初就没有解决,忙着项目上线直接搞了个setInterval不停轮询,哎不说他了;现在空点了来把问题解决了,俗话说得好闲时学来...

vue项目中引入 html2canvas ,控制台报错 Cannot assign to read only property 'className' of object '#&amp;lt; SVGSVGElement &amp;gt;'

 本人遇到该错误,找了好久原因,终于找到了原因, 一开始以为是后台管理系统的模板问题有冲突导致的,于是寻找最初模板使用同样方法引入,竟然没有报错,啊!这个时候就很神伤了。 仔细研究报错内容<SVGSVGElement>,难道和我使用的SVG矢量图有关系?于是尝试把有svg标签的地方全都注释掉了,结果,好了!!!! 原因大致可以归结为,html...

vue项目接入api接口

我们在做项目时,一切基础在于数据上面,所以接入api接口是关键。 访问接口是我们会遇到跨域,而,vue-cli给我们提供了反向代理,所以我们只需要配置一下就可以了。 在config文件中找到index.js,修改dev对象里面的proxyTable如图 然后我们在同个文件夹里面打开dev.env.js这个是生产环境配置文件,我们进行修改 再打开同文件夹...

Ant Design Vue日期选择器DatePicker设置日期格式、获取并设置数据

导入在使用日期选择器前需要先引入momnet: import moment from "moment";import "moment/locale/zh-cn"在引入后使用选择器: <a-date-pickerformat="YYYY-MM-DD HH:mm:ss"v-decorator="['time',{rules: [{ required: t...

vue实战(4):postman测试数据、封装ajax、使用vuex管理状态

书到用时方恨少 这个阶段涉及到了vuex,本来想着不慌,用起来,使用的过程中问题还真不少 本篇涉及到的内容: ---postman 测试数据 ---封装 ajax 请求函数 ---封装接口请求函数 ---使用 vuex 管理状态 ---获取首页相关数据 0. 其它 vue实战(1):准备与资料整理vue实战(2):初始化项目、搭建底部导航路由vue实战...