Vue+Django REST framework实战

搭建一个前后端分离的生鲜超市网站
Django rtf 完成 商品列表页下

drf中的request和response

drf对于django的request和response进行了一层封装。

浏览器请求的request会被drf进行一定的封装,扩展了标准的http request

REST framework's Request class extends the standard HttpRequest, adding support for REST framework's flexible request parsing and request authentication

在基本的httpRequest上进行了扩展。增加了对REST框架灵活的请求解析和请求认证的支持。

Request parsing 对于用户发过来的数据进行一定的解析

  • data 将用户post过来的数据,以及files放到data里面
  • 包括所有的解析内容,文件的,非文件的。
  • 不仅解析post方法过来的内容。其他的如put patch都会帮我们进行解析

.query_params

里面放着get请求传递过来的参数?min=10

.parsers

用户传递过来的数据有很多种类型。比如file啊。post过来的json啊。字符串。

使用drf给我们提供的各种parsers

什么类型的数据都可以接收、调用parser指定对应的解析器

Authentication

认证中的.user就能获取到当前的用户。.auth返回一些额外的信息

response根据你前台传过来的参数等给你返回

比如前台要求返回json 就返回json。 要求返回浏览器可以解析的html就返回html

mark

response也是支持template_render的返回html

drf的过滤器

通过drf为我们提供的过滤功能简单快速的完成过滤

GenericViewSet继承的GenericAPIView中有一个可以供我们重写的方法用于我们的过滤

class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
商品列表页
"""
# queryset是一个属性
# good_viewset.queryset就可以访问到
# 函数就必须调用good_viewset.get_queryset()函数
# 如果有了下面的get_queryset。那么上面的这个就不需要了。
# queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
queryset = Goods.objects.all() def get_queryset(self):
# 价格大于100的
price_min = self.request.query_params.get('price_min', 0)
if price_min:
self.queryset = Goods.objects.filter(shop_price__gt=price_min)
return self.queryset

老师使用的drf中的这里将queryset 放在get 函数内部返回即可。
经我测试,新版本必须如上面代码所示

可能的报错:

    assert queryset is not None, '`base_name` argument not specified, and could ' \
AssertionError: `base_name` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.

可以说报错信息写的很明显了。我们缺少一个queryset的属性。

可能的警告:

 UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'goods.models.Goods'> QuerySet.
paginator = self.django_paginator_class(queryset, page_size)

这个是因为我们没有为我们的返回数据添加一个指定的排序方式。

self.queryset = Goods.objects.filter(shop_price__gt=price_min).order_by('-add_time')

添加指定的排序方式消除警告。

访问: http://127.0.0.1:8000/goods/?page=2&price_min=100

可以看到过滤效果

过滤的优化

即使这样我们还是觉得这个过滤实在是太麻烦了。

又要获取参数,又要判断参数是否存在,存在之后转化为int(我没转)

虽然现在看起来代码不多,但是如果有很多的过滤参数,那么过滤这件事将会变得较为复杂。

使用drf 的 filter

http://www.django-rest-framework.org/api-guide/filtering/

mark

传统的filter 跟我们在xadmin后台中的过滤器差不多。

  • searchFilter 它的行为是search行为。
  • 排序的filter

列表页常见的三种过滤,就是列表页的传统字段精确过滤,搜索过滤,以及排序。

DjangoFilterBackend

pip install django-filter
  • 安装之后加入已安装app的列表中。
django_filters,
  • 添加设置。既然是默认设置一般都自动设置好了。
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
  • 开始使用,首先import进来

goods/views.py

from django_filters.rest_framework import DjangoFilterBackend

官方示例:

class UserListView(generics.ListAPIView):
...
filter_backends = (DjangoFilterBackend,)

我们需要在我们的view中设置

mark
filter_backends = (DjangoFilterBackend,)

我们既然决定使用djangofilter那么就可以不用get_queryset方法了。注释掉

  • 设置我们需要过滤的字段

官方示例:

class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('category', 'in_stock')

我们的实践:

    # 设置我们需要进行过滤的字段
filter_fields = ('name', 'shop_price')

mark

可以看到我们页面的右上多了一个过滤器。这是一个精确地等于的过滤器

?name=&shop_price=100

我们想模糊搜索。或者搜索一个区间。

https://django-filter.readthedocs.io/en/master/

他不但是一个满足drf的filter 也是用于

filter_class

我们可以自定义我们自己的filter类,进行自定义的filter类

在goods目录下新建filters.py

# -*- coding:utf-8 _*-
__author__ = 'mtianyan'
__date__ = '2018/03/03 00:44' from django_filters import rest_framework as filters
from goods.models import Goods class GoodsFilter(filters.FilterSet):
"""
商品的过滤类
"""
# 指定字段以及字段上的行为,在shop_price上大于等于
price_min = filters.NumberFilter(name="shop_price", lookup_expr='gte')
price_max = filters.NumberFilter(name="shop_price", lookup_expr='lte') class Meta:
model = Goods
fields = ['price_min', 'price_max']
    # 设置三大常用过滤器之DjangoFilterBackend
filter_backends = (DjangoFilterBackend,) # 设置filter的类为我们自定义的类
filter_class = GoodsFilter

注释掉: filter_fields,这时候我们的filter_fields已经失效了

mark

过滤器没有确定的按钮是因为继承错了。应该继承rf的import rest_framework as filters

drf的搜索和排序

我们不一定在这个类里面使用它自带的过滤方法。还可以自定义我们的过滤方法,这个在后面会讲到。

https://code.ziqiangxuetang.com/django/django-queryset-api.html

Django QuerySetAPI

模糊查询

    # 行为: 名称中包含某字符,且字符不区分大小写
name = filters.CharFilter(name="name", lookup_expr="icontains") class Meta:
model = Goods
fields = ['price_min', 'price_max', 'name']

配置drf里面的SearchFilter

http://www.django-rest-framework.org/api-guide/filtering/#searchfilter

from rest_framework import filters

    # 设置三大常用过滤器之DjangoFilterBackend, SearchFilter
filter_backends = (DjangoFilterBackend, filters.SearchFilter)

上面代码中的filter一定要注意不是django中的filter而是restframe中的。不然会报错。

    filter_backends = (DjangoFilterBackend, filters.SearchFilter)
AttributeError: module 'django_filters.rest_framework.filters' has no attribute 'SearchFilter'

配置了search_fields之后配置我们的search_fields

    # 设置我们的search字段
search_fields = ('name', 'goods_brief', 'goods_desc')

search_fields.

  • ^ Starts-with search.
  • = Exact matches.
  • @ Full-text search. (Currently only supported Django's MySQL backend.)
  • $ Regex search.

以当前字段值开头的,等于类似于字段精确过滤。全文搜索。正则表达式搜索

search_fields = ('=username', '=email')

By default, the search parameter is named 'search', but this may be overridden with the SEARCH_PARAM setting.

默认的search参数为

mark

search。可以在设置中覆盖SEARCH_PARAM 进行自定义。

可以为多个字段配置不同精度的搜索。比如name是精确搜索,简介是模糊搜索这种。

OrderingFilter支持排序

    # 设置三大常用过滤器之DjangoFilterBackend, SearchFilter
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
# 设置排序
ordering_fields = ('sold_num', 'add_time')

一般全文搜索,真正的模糊查询是使用elasticSearch来做的。

but this may by overridden with the ORDERING_PARAM setting.

重写order 参数。来实现url中指定参数值

不止数据的获取,数据的提交以及后面的login验证等,都可以在这个界面进行操作。

总结

  1. view_base中通过django自身的原生view实现了商品列表页。
  2. 自己序列化 - model_to_dict方法 - 使用Serializer - JSonresponse
  3. api view generics - viewsets

原文学习来自简书 作者:天涯明月笙
原文链接:https://www.jianshu.com/p/d6e8e6815f4e

6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)的更多相关文章

  1. 5- vue django restful framework 打造生鲜超市 -完成商品列表页(上)

    使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, ...

  2. 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍

    4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍 天涯明月笙 关注 2018.02.20 19:23* 字数 762 阅读 135 ...

  3. 3- vue django restful framework 打造生鲜超市 - model设计和资源导入

    3- vue django restful framework 打造生鲜超市 - model设计和资源导入 使用Python3.6与Django2.0.2(Django-rest-framework) ...

  4. 7- vue django restful framework 打造生鲜超市 -商品类别数据展示(上)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页 并没有将列表页的数据json 与前端的页面展示结合起来 讲解如果将dr ...

  5. 1- vue django restful framework 打造生鲜超市

    Vue+Django REST framework实战 使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支 ...

  6. 2- vue django restful framework 打造生鲜超市 -环境搭建

    使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, ...

  7. 引爆潮流技术 Vue+Django REST framework打造生鲜电商项目

    引爆潮流技术Vue+Django REST framework打造生鲜电商项目 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受, ...

  8. Vue+Django REST framework打造生鲜电商项目

    1-1 课程导学 2-1 Pycharm的安装和简单使用 2-2 MySQL和Navicat的安装和使用 2-3 Windows和Linux下安装Python2和Python3 2-4 虚拟环境的安装 ...

  9. web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝

    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...

随机推荐

  1. cocos

    cocos compile -p android --android-studio --app-abi=armeabi-v7a ./adb kill-server&& ./adb se ...

  2. 常见的SQL错误和解决方法

    前言 今天你会看到每个人——从新手到专家——在使用SQL时犯的各种常见错误.你不能永远避免犯任何错误,但是熟悉广泛的错误将帮助你在尽可能短的时间内解决这些错误. 注:在我们的例子中我们使用的是Orac ...

  3. P1868 饥饿的奶牛

    题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你可以选择任意区间但不能有 ...

  4. angular 学习笔记(1) 使用angular完整写法

    视图部分: <div ng-app="myapp"> <div ng-controller="myctrl"> <p>{{n ...

  5. windows下 php集成环境如何通过cmd执行命令

    ---恢复内容开始--- php学习过程中 Windows环境下的php集成程序很多 这样方便了学习 但是在熟悉命令使用方面可以说是十分不便 本文将从两个方便 向大家介绍如何快速通过cmd命令实现命令 ...

  6. vc++ 6.0编译后生成的文件

    程序在编译后,在目标路径下会生成多个文件    Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg  ...

  7. 父类和子类以及super关键字

    super和this关键字的特点类似:super代表的是父类对象的引用. 当子父类的成员出现同名时,可以通过super来进行区分. 子类的构造方法中,通过super关键字调用父类的构造方法. publ ...

  8. Garmin APP开发之入门

    Garmin开发-入门 先附上几个已经开发完成的app日历 up down 翻月 start 回到当前月(就差农历了) 秒表和定时器一体app界面比较简单,但是实用,长按菜单键可以切换秒表和定时器,有 ...

  9. 大数四则运算java(转)

    // 大数的四则运算 #include <iostream> #include <string> #include <algorithm> using namesp ...

  10. 开发Maven插件

    Mojo: Maven plain Old Java Object 1.插件命名规则:maven-<yourplugin>-plugin是Maven的保留字段,不允许使用,我们可以用< ...