Django REST framework+Vue 打造生鲜超市(十二)

全栈生鲜超市平台:Python-Django与Vue.js实战开发 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它由经验丰富的开发人员构建,并且从第一天起就遵循“约定优于配置”的原则。# 创建一个Django项目在项目中,主要工作是在应用的views.py中编写视图函数或类,并在urls.py中将URL映射到视图上。RESTful架构是一种网络软件架构风格,它以资源为核心,通过HTTP的GET、POST、PUT、DELETE等方法,对网络中的资源进行操作。 阅读详情

代码下载

github

教程

学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 

十三、首页、商品数量、缓存和限速功能开发

 13.1.轮播图接口实现

首先把pycharm环境改成本地的,vue中local_host也改成本地 

(1)goods/serializer

复制代码

class BannerSerializer(serializers.ModelSerializer):
    '''
    轮播图
    '''
    class Meta:
        model = Banner
        fields = "__all__"

复制代码

(2)goods/views.py

复制代码

class BannerViewset(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    首页轮播图
    """
    queryset = Banner.objects.all().order_by("index")
    serializer_class = BannerSerializer

复制代码

(3)url

# 配置首页轮播图的url
router.register(r'banners', BannerViewset, base_name="banners")

在后台添加首页轮播图图片

 

 13.2.新品接口功能开发

在设计Goods model时候有一个字段is_new

is_new = models.BooleanField("是否新品",default=False)

实现这个接口只要在goods/filters/GoodsFilter里面添加一个过滤就可以了

    class Meta:
        model = Goods
        fields = ['pricemin', 'pricemax','is_hot','is_new']

在后台设置几个商品 is_new

 

13.3.首页商品分类显示功能

 首先是大类,然后里面有

  • 商品商标(多个)
  • 大类下的二级类
  • 广告商品
  • 所有商品

 

 

(1)goods/serializers.py

复制代码

class BrandSerializer(serializers.ModelSerializer):
    '''
    大类下面的宣传商标
    '''
    class Meta:
        model = GoodsCategoryBrand
        fields = "__all__"


class IndexCategorySerializer(serializers.ModelSerializer):
    #某个大类的商标,可以有多个商标,一对多的关系
    brands = BrandSerializer(many=True)
    # good有一个外键category,但这个外键指向的是三级类,直接反向通过外键category(三级类),取某个大类下面的商品是取不出来的
    goods = serializers.SerializerMethodField()
    # 在parent_category字段中定义的related_name="sub_cat"
    # 取二级商品分类
    sub_cat = CategorySerializer2(many=True)
    # 广告商品
    ad_goods = serializers.SerializerMethodField()

    def get_ad_goods(self, obj):
        goods_json = {}
        ad_goods = IndexAd.objects.filter(category_id=obj.id, )
        if ad_goods:
            #取到这个商品Queryset[0]
            good_ins = ad_goods[0].goods
            #在serializer里面调用serializer的话,就要添加一个参数context(上下文request),嵌套serializer必须加
            # serializer返回的时候一定要加 “.data” ,这样才是json数据
            goods_json = GoodsSerializer(good_ins, many=False, context={'request': self.context['request']}).data
        return goods_json

    #自定义获取方法
    def get_goods(self, obj):
        # 将这个商品相关父类子类等都可以进行匹配
        all_goods = Goods.objects.filter(Q(category_id=obj.id) | Q(category__parent_category_id=obj.id) | Q(
            category__parent_category__parent_category_id=obj.id))
        goods_serializer = GoodsSerializer(all_goods, many=True, context={'request': self.context['request']})
        return goods_serializer.data

    class Meta:
        model = GoodsCategory
        fields = "__all__"

复制代码

(2)goods/views.py

复制代码

class IndexCategoryViewset(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    首页商品分类数据
    """
    # 获取is_tab=True(导航栏)里面的分类下的商品数据
    queryset = GoodsCategory.objects.filter(is_tab=True, name__in=["生鲜食品", "酒水饮料"])
    serializer_class = IndexCategorySerializer

复制代码

(3)url

# 首页系列商品展示url
router.register(r'indexgoods', IndexCategoryViewset, base_name="indexgoods")

 

13.4.商品点击数和收藏数

(1)点击数

GoodsListViewSet其中继承了mixins.RetrieveModelMixin(获取商品详情)

源码

复制代码

class RetrieveModelMixin(object):
    """
    Retrieve a model instance.
    """
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

复制代码

我们只要重写他的retrieve方法就可以了

goods/views

复制代码

  #商品点击数 + 1
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.click_num += 1
        instance.save()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

复制代码

 GoodListViewSet

 

(2)收藏数

前面已经写了UserFavViewset,其中继承了mixins.CreateModelMixin,添加收藏实际就是创建数据库

这里重写它的perform_create方法就可以了

user_operation/view.py

复制代码

# 用户收藏的商品数量+1
    def perform_create(self, serializer):
        instance = serializer.save()
        # 这里instance相当于UserFav model,通过它找到goods
        goods = instance.goods
        goods.fav_num += 1
        goods.save()

复制代码

 UserFavViewset

 

(3)用信号量实现

delete和create的时候django model都会发送一个信号量出来,用信号量的方式代码分离性更好

收藏数+1和-1

(1)user_operation/signal.py

复制代码

# users_operation/signals.py

from django.db.models.signals import post_save,post_delete
from django.dispatch import receiver
from user_operation.models import UserFav

# post_save:接收信号的方式
#sender: 接收信号的model
@receiver(post_save, sender=UserFav)
def create_UserFav(sender, instance=None, created=False, **kwargs):
    # 是否新建,因为update的时候也会进行post_save
    if created:
        goods = instance.goods
        goods.fav_num += 1
        goods.save()

@receiver(post_delete, sender=UserFav)
def delete_UserFav(sender, instance=None, created=False, **kwargs):
        goods = instance.goods
        goods.fav_num -= 1
        goods.save()

复制代码

(2)user_operation/apps.py

复制代码

from django.apps import AppConfig


class UserOperationConfig(AppConfig):
    name = 'user_operation'
    verbose_name = "操作管理"

    def ready(self):
        import user_operation.signals

复制代码

 

13.5.商品库存和销量修改

库存数量

商品库存数量的行为:

  • 新增商品到购物车
  • 修改购物车数量
  • 删除购物车记录

trade/views.py

复制代码

# 库存数-1
    def perform_create(self, serializer):
        shop_cart = serializer.save()
        goods = shop_cart.goods
        goods.goods_num -= shop_cart.nums
        goods.save()

    # 库存数+1
    def perform_destroy(self, instance):
        goods = instance.goods
        goods.goods_num += instance.nums
        goods.save()
        instance.delete()

    # 更新库存,修改可能是增加页可能是减少
    def perform_update(self, serializer):
        #首先获取修改之前的库存数量
        existed_record = ShoppingCart.objects.get(id=serializer.instance.id)
        existed_nums = existed_record.nums
        # 先保存之前的数据existed_nums
        saved_record = serializer.save()
        #变化的数量
        nums = saved_record.nums-existed_nums
        goods = saved_record.goods
        goods.goods_num -= nums
        goods.save()

复制代码

 ShoppingCartViewset

 

商品销量

商品的销量只有在支付成功后才会 +1

trade/views.py

                for order_good in order_goods:
                    goods = order_good.goods
                    goods.sold_num += order_good.goods_num
                    goods.save()

 AlipayView

 

13.6.drf的缓存设置

为了加速网站的访问速度,将一些数据放到缓存当中,取数据的时候首先去缓存中去,然后再去数据库中取

我们用drf的一个扩展来实现缓存,github上面的使用说明:http://chibisov.github.io/drf-extensions/docs/#caching

 

 

 

 

 (1)安装

pip install drf-extensions

(2)使用方法

导入

from rest_framework_extensions.cache.mixins import CacheResponseMixin

在GoodsListViewSet中添加缓存功能

#CacheResponseMixin一定要放在第一个位置

class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin, mixins.RetrieveModelMixin,viewsets.GenericViewSet):

设置过期时间,settings里面

#缓存配置
REST_FRAMEWORK_EXTENSIONS = {
    'DEFAULT_CACHE_RESPONSE_TIMEOUT': 5   #5s过期,时间自己可以随便设定
}

这个缓存使用的是内存,每次重启之后就会失效

 

13.7.drf配置redis缓存

使用django-redis第三方库:http://django-redis-chs.readthedocs.io/zh_CN/latest/#id8    (文档说明)

 

 (1)安装

pip install django-redis

(2)settings

复制代码

# redis缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

复制代码

13.8.drf的throttle设置api的访问速率

为了防止爬虫对服务器造成的重大压力,对数据进行访问速率限制就显得非常的重要了

官网使用说明:http://www.django-rest-framework.org/api-guide/throttling/

 

(1)settings中配置

复制代码

REST_FRAMEWORK = {
    #限速设置
    'DEFAULT_THROTTLE_CLASSES': (
            'rest_framework.throttling.AnonRateThrottle',   #未登陆用户
            'rest_framework.throttling.UserRateThrottle'    #登陆用户
        ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/minute',         #每分钟可以请求两次
        'user': '5/minute'          #每分钟可以请求五次
    }
}

复制代码

(2)goods/views.py中使用

复制代码

from rest_framework.throttling import UserRateThrottle,AnonRateThrottle

class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin, mixins.RetrieveModelMixin,viewsets.GenericViewSet):
  .
  .
  throttle_classes = (UserRateThrottle, AnonRateThrottle)

复制代码

 

 

生鲜水果商品商城静态网站,vue+elementui简单实现 生鲜水果商品商城静态网站,vue+elementui简单实现,css+html 阅读详情

相关推荐

Python-DjangoRESTframeworkvue打造生鲜超市

Django REST framework vue 打造生鲜超市

Vue+Element UI 生鲜管理系统简介及项目搭建,页面布局(一)

项目所需要的各种配置文件,类似java中的pom文件。这个文件是在执行在npm install的时候自动生成,用以记录当前状态下实际安装的各个依赖包的具体来源和版本号以及这个模块又依赖了哪些依赖。你可以简单的理解为对 package.json 里 dependencies 和 devDependencies 的精确描述。babel作为转译工具使我们的 JavaScript 代码正常运行在旧的或不支持新语法和api的环境。

世上哪有什么岁月静好,不过是有人替你负重前行 9004

vue django 前后端分离 生鲜电商前端项目

前端 注意是前端 原封不动

Vue+Django(打造前后端分离的生鲜电商项目)

Django综合实战,从0打造一个模块完整、功能完善、达到上线标准的在线教育平台,全面掌握Django的同时,得到一套完整的代码,把真实的“部署上线”给你讲透,没经验的同学有福了! 用Python第一大网络框架 Django 制作符合潮流的接口开发?这门课很有针对性!使用Django 最完备、使用率最高的 Django REST framework,讲解内容相当详实。另外还有良心第三方登...

qq_36152827的博客 1669

django3.0+rest framework + Vue 生鲜超市项目-后端

django3.0+rest framework + Vue 生鲜超市学习素材,学习交流好素材,亲测正常

~~~慕克生鲜 Vue源码~~~

Vue+Django REST framework 打造生鲜电商项目,慕克生鲜 Vue源码,分享给大家 #online-store前端 vue2.3 vuex vue-router 运行: npm install npm run dev

Django+Vue开发生鲜电商平台之1.项目介绍

本项目旨在使用Django、Vue和REST Framework等技术开发一个前后端分离的生鲜电商平台。项目的核心技术为Vue+Django+REST Framework前后端分离技术,其中,vue实现前端项目,django rest framework系统实现前台功能,xadmin实现后台管理。Django REST Framework有很多技术要点,用于实现不同的功能,Vue也有很多技术要点,也会对Django进行深入讲解,并且针对开发中经常出现的问题给出相应的解决办法,同时需要有一定的技术储备。

CUFEECR的博客 4503

Django 前后端分离实战项目 生鲜超市(十四)之支付宝接入

支付宝接入 前言 所有vue接口全部在src/api/api.js文件下 代码已上传至github:https://github.com/kalipoison/fresh-market 此项目仅学习用途 要求 Package Version certifi 2020.4.5.1 chardet 3.0.4 coreapi 2.3.1 coreschema 0.0.4 Django 1.11.3 django

Django REST framework+Vue 打造生鲜超市(四)

代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 五、商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django rest framework的view 利用Django的view实现返回jso...

Just for fun的专栏 450

Android 导出aar 用于Unity 百度语音唤醒

AndroidStudio版本下载地址Android Studio Arctic Fox Unity版本2021.3.26f1c1 新建AndroidStudio工程 新建module 这里注意一下,网上很多教程说要注意包名要和unity一样,但是测试下来,不一样也可以的 在新建的module里添加这两个jar包,并点击右键add as library 导入jniLibs 右键创建这几个package 代码就安装这个大佬的写参考代码 需要注意的的是在WakeupListener脚本里U

weixin_38777563的博客 633

下水管道损坏检测数据集总结

下水管道损坏检测数据集包含 6708 张图像,为下水管道损坏情况的检测提供了丰富的数据基础。该数据集提供了 YOLO 和 VOC 两种常见的标注方式,方便不同需求的使用者进行模型训练和研究。

crz1336768325的博客 867

Django REST framework+Vue 打造生鲜超市(二)

代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 三、Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow 图片处理 pip install djangorestframework pip in...

Just for fun的专栏 591

envi反演水质参数_遥感水质反演之反演模型

水质反演的框架图此为反演模型的章节第一部分,统计学基础:概率论、矩阵和数理统计的知识统计学知识框架# 1 基本统计概念知识在于应用,而非记忆!我们都是在样本的层面去操作数据的,以达到对总体性质的估计和推断,拿到一组数据首先进行基本的统计描述,常用的有:样本均值: 样本方差(调整方差)不是除以n,而是n-1, 标准差为样本方差开方即可皮尔逊积矩相关系数(简称相关系数): 相关系数范围在[-1,...

weixin_35275922的博客 3227

Django进阶 Django REST framework+Vue 打造生鲜超市第一天 搭建环境

1.搭建虚拟环境 新建文件夹VirtualEns 新建环境变量 安装 pip install virtualenv pip install virtualenvwrapper-win mkvirtualenv DjangoProject #创建虚拟环境 workon #查看有哪些虚拟环境 workon DjangoProject #进入...

qq_40604197的博客 462

绑定压力的计算方法

压强的公式为P=F/S,其中P为ACF要求的本压压强范围,S为受压面积,F为本压压头施加的力。绑定参数需要按线体按压头进行DOE确认,并使用DOE确认好的参数按压头重新绑定标识好送ACF厂商实测固化率、粒子变形的情况,避免绑定参数导致的异常,在绑定参数的设定过程中温度和时间可以使用仪器实测但绑定的压力则需要换算。工程上绑定压力换算的原则是:1、FPC属于柔性物料,柔性物料的受压面积按FPC绑定的受压面积=FPC绑定的长度。一、工程上FOG FPC本压压力换算(柔性材料以挤压的接触面积=受力面积)F=P。

weixin_53757859的博客 1532

基于simulink 的不间断电源ups的项目实例

UPS系统的核心组件包括整流器、逆变器、电池管理系统和控制系统。- **Three-Phase Controlled Rectifier**:设置触发角为0度,用于控制整流器的输出电压。- **Three-Phase Inverter**:设置逆变器的输出频率为60Hz,用于将直流电转换为交流电。- **Control System**:编写MATLAB函数,用于监测市电状态并控制各模块的工作模式。- **Step**:设置阶跃时间,例如0.05秒,阶跃前后的值分别为0和1,用于模拟市电中断。

xiaoheshang_123的博客 708

Django REST framework+Vue 打造生鲜超市(三)

代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 四、xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugins文件夹下新建文件ueditor.py 代码如下: # xadmin/plugins/ueditor.py import xadmin from xadmin.views ...

Just for fun的专栏 523

R3LIVE项目实战(3) —双目相机与激光雷达 lidar_camera_calib联合标定

lidar_camera_calib是一个在无目标环境中,用于高分辨率LiDAR(例如Livox)和摄像机之间准确的外部标定工具。我们的算法可以在室内和室外场景中运行,并且只需要场景中的边缘信息。如果场景适合,我们可以实现类似于或甚至超过基于目标的方法的像素级准确度。我们使用标定的外部参数给点云上色,并与实际图像进行比较。A和C是点云的局部放大视图。B和D是与A和C中的点云对应的摄像机图像的部分。

几度春风里的博客 4057

Django REST framework+Vue 打造生鲜超市(六)

代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 七、用户登录与手机注册 7.1.drf的token (1)INSTALL_APP中添加 INSTALLED_APPS = ( ... 'rest_framework.authtoken' ) token会生成一张表authtoken_token,所以要运...

Just for fun的专栏 439

沙猫群优化算法(SCSO)详解:从沙漠生存智慧到全局优化引擎

本文详细介绍了沙猫群优化算法(SCSO),这是一种新型元启发式优化算法,灵感来源于沙猫在沙漠环境中的卓越狩猎行为。SCSO通过模拟沙猫的低频探测能力和精确攻击策略,将优化问题转化为搜索和捕获"猎物"的过程。算法核心包括探索阶段(全局搜索)和开发阶段(局部精细搜索),通过灵敏度范围模型和自适应控制参数实现两者的平衡。SCSO具有参数简单、收敛性能好等优点,适用于解决复杂全局优化问题。

qq_42212808的博客 200

BACnet协议栈基本对象BI、BO、AI、AO、AV以及device和File对象介绍

BACnet协议栈基本对象BI、BO、AI、AO、AV以及device和File对象介绍

shufawangzhang的博客 3984

Django REST framework+Vue 打造生鲜超市(十一)

代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 十二、支付宝沙箱环境配置 12.1.创建应用 进入蚂蚁金服开放平台(https://open.alipay.com/platform/home.htm),登录后进入管理中心-->>应用列表 创建应用 创建应用后会有一个appid。还需要提交信息进行...

Just for fun的专栏 983

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Django REST framework+Vue 打造生鲜超市(八)

代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 九、个人中心功能开发 9.1.drf的api文档自动生成 (1)url #drf文档,title自定义 path('docs',include_docs_urls(title='仙剑奇侠传')), 访问:http://127.0.0.1:8000/docs 就...

Just for fun的专栏 373

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Django REST framework+Vue 打造生鲜超市(一)

代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 一、项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实现和核心源码分析 Sentry 完成线上系统的错误日志的监控和告警 第...

Just for fun的专栏 1050

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Django REST framework+Vue 打造生鲜超市(九)

代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 十、购物车、订单管理和支付功能 10.1.添加商品到购物车 (1)trade/serializer.py # trade/serializer.py __author__ = 'derek' from .models import ShoppingCart from...

Just for fun的专栏 305
上一篇: Django REST framework+Vue 打造生鲜超市(十一)
下一篇: Django REST framework+Vue 打造生鲜超市(十三)
CopperDong
博客等级 码龄14年 1205粉丝 466原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值