当前位置: 首页 > news >正文

django rest framework 学习笔记-实战商城3

 01用户模块模型定义_哔哩哔哩_bilibili  本博客借鉴至大佬的视频学习笔记

用户模块及商品数据表结构设计

from ckeditor.fields import RichTextField  # pip install django-ckeditor
from django.db import models# Create your models here.
# from wx.richtext import RichTextFieldfrom common.db import BaseModelclass GoodsGroup(BaseModel):"""商品分类"""name = models.CharField(verbose_name="分类名称", help_text="分类名称", max_length=15,blank=True,null=True)image = models.CharField(verbose_name="图片链接", help_text="图片链接", max_length=200, blank=True, null=True)status = models.BooleanField(verbose_name="是否启用", help_text="是否启用", default=False,blank=True,null=True)class Meta:db_table = 'goods_group'verbose_name = "商品分类表"verbose_name_plural = verbose_namedef __str__(self):return self.nameclass Goods(BaseModel):"""商品"""group = models.ForeignKey('GoodsGroup', verbose_name="分类", help_text="分类", max_length=15, on_delete=models.CASCADE)image = models.CharField(verbose_name="图片链接", help_text="图片链接", max_length=200, blank=True, null=True)title = models.CharField(verbose_name="标题", help_text="标题", max_length=20, blank=True,null=True)desc = models.CharField(verbose_name="商品描述", help_text="商品描述", max_length=200, blank=True,null=True)price = models.DecimalField(verbose_name="商品价格", help_text="商品价格", max_digits=10, decimal_places=2, blank=True,null=True)cover = models.ImageField(verbose_name="封面图链接", help_text="封面图链接", max_length=200, blank=True,null=True)stock = models.IntegerField(verbose_name="库存", help_text="库存", blank=True, null=True, default=1)sales = models.IntegerField(verbose_name="销量", help_text="销量", blank=True, null=True, default=0)is_on = models.BooleanField(verbose_name="是否上架", help_text="是否上架", blank=True, null=True, default=False)recommend = models.BooleanField(verbose_name="是否推荐", help_text="是否推荐", blank=True, null=True, default=False)class Meta:db_table = 'goods'verbose_name = '商品表'verbose_name_plural = verbose_namedef __str__(self):return self.titleclass Detail(BaseModel):"""商品详情"""goods = models.OneToOneField('Goods', verbose_name="商品", on_delete=models.CASCADE, max_length=200)producer = models.CharField(verbose_name='厂商', help_text='厂商', max_length=200, blank=True,null=True)norms = models.CharField(verbose_name='规格', help_text='规格', max_length=200, blank=True,null=True)details = RichTextField(verbose_name='商品详情', help_text='商品详情', max_length=200,blank=True,null=True)class Meta:db_table = 'details'verbose_name = '详情'verbose_name_plural = verbose_namedef __str__(self):return self.goodsclass GoodsBanner(BaseModel):"""商品轮播图"""title = models.CharField(verbose_name='轮播图名称', help_text='轮播图名称', max_length=20, blank=True)image = models.ImageField(verbose_name='轮播图链接', help_text='轮播图链接', max_length=200, blank=True)# url = models.CharField(verbose_name='跳转的地址',help_text='跳转的地址',max_length=200,blank=True)status = models.BooleanField(verbose_name='是否启用', help_text='是否启用', default=False,blank=True,null=True)seq = models.IntegerField(verbose_name='顺序', help_text='顺序', default=1, blank=True,null=True)class Meta:db_table = 'banner'verbose_name = '首页商品轮播'verbose_name_plural = verbose_namedef __str__(self):return self.titleclass Collect(models.Model):"""商品收藏"""user = models.ForeignKey('users.User', help_text='用户ID', verbose_name='用户ID', on_delete=models.CASCADE,blank=True,null=True)goods = models.ForeignKey('goods.Goods', help_text="商品ID", verbose_name="商品ID", on_delete=models.CASCADE,blank=True,null=True)class Meta:db_table = 'collect'verbose_name = "收藏商品"verbose_name_plural = verbose_namedef __str__(self):return self.goods

Django自带admin配置

from django.contrib import admin
from .models import GoodsGroup,Goods,Detail,GoodsBanner,Collect
# Register your models here.@admin.register(GoodsGroup)
class GoodsGroupAdmin(admin.ModelAdmin):list_display = ['name','status']@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):list_display = ['title','group','price','stock','sales','is_on']@admin.register(Detail)
class DetailGroupAdmin(admin.ModelAdmin):list_display = ['goods', 'producer','norms']@admin.register(GoodsBanner)
class GoodsBannerAdmin(admin.ModelAdmin):list_display = ['title', 'status']@admin.register(Collect)
class CollectAdmin(admin.ModelAdmin):list_display = ['user', 'goods']

商品首页接口实现

class IndexView(APIView):"""首页数据展示"""def get(self,request):"""返回轮播图、商品分类"""group = GoodsGroup.objects.filter(status=True)groupSer =GoodsGroupSerializer(group,many=True)# 轮播图banner = GoodsBanner.objects.filter(status=True)bannerSer = GoodsBannerSerializer(banner,many=True)# 推荐的商品goods = Goods.objects.filter(recommend=True)goodsSer = GoodsSerializer(goods,many=True)# 返回数据result = {'banner': bannerSer.data,'goods':goodsSer.data,'group':groupSer.data}return Response({"message":'ok','data':result},status=status.HTTP_200_OK)# 商品首页
path('index/', IndexView.as_view()),

商品列表获取和分类排序接口

# view
class GoodsView(ReadOnlyModelViewSet):""""商品列表接口"""serializer_class = GoodsSerializer# 选择上架的商品queryset = Goods.objects.filter(is_on=True),# 实现商品分类和推荐类过滤filterset_fields = ('group','recommend')# 通过价格和销量排序ordering_fields =('sales','price','create_time')# url
# 商品列表接口
path('goods/', GoodsView.as_view({"get":'list'})),
# 单个商品获取
path('goods/<int:pk>/', GoodsView.as_view({"get":'retrieve'})),# setting
# 过滤器信息配置、排序器配置
'DEFAULT_FILTER_BACKENDS':['django_filters.rest_framework.DjangoFilterBackend','rest_framework.filters.OrderingFilter']# 注册
'django_filters',

商品的收藏与取消收藏接口

# view
class CollectView(mixins.RetrieveModelMixin,mixins.CreateModelMixin,mixins.ListModelMixin,mixins.DestroyModelMixin,GenericViewSet):"""商品收藏与取消create: 收藏delete: 取消list: 收藏列表"""queryset = Collect.objects.all()serializer_class = CollectSerializerpermission_classes =  [IsAuthenticated,CollectPermissions]filterset_fields = ("user",)def create(self, request, *args, **kwargs):# 获取请求参数user = request.userparams_user_id = request.data.get('user')# 检验请求参数中的id是否当前登录的用户IDif user.id != params_user_id:return Response({'error':'你没有用户权限访问该信息'},status=status.HTTP_400_BAD_REQUEST)return super().create(request, *args, **kwargs)def list(self, request, *args, **kwargs):"""商品收藏列表"""queryset = self.filter_queryset(self.get_queryset())queryset = queryset.filter(user=request.user)serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)# perssion
from rest_framework import permissions
class CollectPermissions(permissions.BasePermission):"""Custom permission to only allow owners of an object to edit it."""def has_object_permission(self, request, view, obj):# 判断是否是管理员if request.user.is_superuser:return True# 判断当前的用户对象和登录的用户对象是否是同一个,防止越权return obj == request.user# url
# 收藏商品
path('collect/', CollectView.as_view({"post":'create','get':'list'})),
# 取消收藏
path('collect/del/<int:pk>/', CollectView.as_view({"delete":'destroy'})),

商品购物车的接口实现: 购物车添加数量、修改商品购物车状态、加购商品

# serializer
from rest_framework import serializers
from apps.cart.models import Cart
from apps.goods.serializers import GoodsSerializerclass CartSerializer(serializers.ModelSerializer):"""用户的模型序列化器-写入"""class Meta:model = Cartfields = '__all__'class ReadInfoSerializer(serializers.ModelSerializer):"""用户的模型序列化器-读取"""goods =GoodsSerializer()class Meta:model = Cartfields = '__all__'# view
from rest_framework import status
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet,mixins
from .models import Cart
from .serializers import CartSerializer, ReadInfoSerializer# Create your views here.class  CartViecw(GenericViewSet,mixins.CreateModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin):queryset = Cart.objects.all()serializer_class = CartSerializerdef get_serializer_class(self):# 实现读写操作使用不同的序列化器if self.action == 'list':return ReadInfoSerializerelse:return self.serializer_classdef create(self, request, *args, **kwargs):user = request.usergoods  =request.data.get('goods')if Cart.objects.filter(user=user,goods=goods):# 该商品存在cart_goods = Cart.objects.get(user=user,goods=goods)cart_goods.number +=1cart_goods.save()# 商品序列化serializer = self.get_serializer(cart_goods)return Response(serializer.data,status=status.HTTP_201_CREATED)else:# 没有该商品则进行添加该商品request.data['user'] = user.idreturn super().create(request,*args,**kwargs)def list(self, request, *args, **kwargs):query =self.get_queryset().filter(user=request.user)serializer = self.get_serializer(query, many=True)return Response(serializer.data)def update_goods_status(self,request, *args, **kwargs):obj =self.get_object()obj.is_checked = not obj.is_checkedobj.save()return Response({"message":'修改成功'},status=status.HTTP_200_OK)def update_goods_number(self,request, *args, **kwargs):number = request.data.get('number')obj = self.get_object()if not isinstance(number,int): return Response({'error':'参数number只可为INT类型'})if number > obj.goods.stock:return Response({"message": "数量不可超过该商品的库存数量"}, status=status.HTTP_422_UNPROCESSABLE_ENTITY)elif number <= 0:obj.delete()return Response({"message":"修改成功,已删除"},status=status.HTTP_200_OK)else:obj.number = numberobj.save()return Response({"message": "修改成功"}, status=status.HTTP_200_OK)# url
from apps.cart.views import CartViecw
urlpatterns = [# 商品首页path('cart/', CartViecw.as_view({"post":'create','get':'list'})),# 修改商品购物车的状态path('cart/<int:pk>/checked/', CartViecw.as_view({"put":'update_goods_status'})),# 修改商品数量path('cart/<int:pk>/number/', CartViecw.as_view({"put": 'update_goods_number'})),]

以上是django restframework商城的后端实现。

相关文章:

django rest framework 学习笔记-实战商城3

01用户模块模型定义_哔哩哔哩_bilibili 本博客借鉴至大佬的视频学习笔记 用户模块及商品数据表结构设计 from ckeditor.fields import RichTextField # pip install django-ckeditor from django.db import models# Create your models here. # from wx.richtext import Ri…...

WPF真入门教程29--MVVM常用框架之MvvmLight

1、MVVM模式回顾 关于mvvm模式的基础知识&#xff0c;请看这2个文章&#xff1a; WPF真入门教程23--MVVM简单介绍 WPF真入门教程24--MVVM模式Command命令 做过VUE开发或微信小程序开发的伙伴&#xff0c;就知道MVVM模式&#xff0c;核心就是数据驱动控件&#xff0c;全栈开…...

QT-Day4

思维导图 作业&#xff1a; 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMessageBox> #include <QTimerEvent>//定时器事件类 #include <QTime> #include <QDebug> #include <QPushButton> #include <QT…...

代码随想录算法训练营第三天

● 自己看到题目的第一想法 203.移除链表元素 方法一&#xff1a; 思路&#xff1a; 设置虚拟头节点 dummyhead 设置临时指针 cur 遍历 整个链表 循环&#xff1a; 如果 cur !nullptr &&cur->next !nullptr 则 遍历链表 否则结束遍历 如果 cur->next val 则…...

蓝桥杯刷题1

目录 1. 平方和 2. 门牌制作 3. 卡片 4. 分数 5. 星期一 6. 顺子日期 1. 平方和 题目描述&#xff1a;小明对数位中含有2、0、1、9 的数字很感兴趣&#xff0c;在1 到40 中这样的数包 括1、2、9、10 至32、39 和40&#xff0c;共28 个&#xff0c;他们的和是574&#x…...

前端学习---- 前端HTML基本元素的介绍

一&#xff1a;显示相关的HTML基础知识 1. 推荐的前端编写工具 2. VScode的html速写规则&#xff08;从a标签开始再用&#xff09; ①、&#xff01;&#xff1a;代表生成html的基本框架元素 ②、html元素&#xff1a;直接书写html,不需要加<>,按回车会自动生成 ③、{}…...

力扣思路题:丑数

此题的思路非常奇妙&#xff0c;可以借鉴一下 bool isUgly(int num){if(num0)return false;while(num%20)num/2;while(num%30)num/3;while(num%50)num/5;return num1; }...

C# this关键字的作用

在C#中&#xff0c;this 关键字有以下几种主要作用&#xff1a; 引用当前对象&#xff1a;this 用于引用当前类的实例。可以通过 this 关键字来访问当前对象的成员变量、方法和属性。 class MyClass {private int myVar;public void SetVar(int var){this.myVar var; // 使用…...

Ubuntu18.04虚拟机磁盘扩容-lvm

Ubuntu18.04虚拟机磁盘扩容-lvm 前提虚拟机虚拟磁盘扩容使用新增的磁盘空间扩展vg和lv 前提 没有虚拟机快照虚拟磁盘不是一次性分配空间其它会影响扩容的前置条件 虚拟机虚拟磁盘扩容 此部分不做详细说明。 使用新增的磁盘空间 此节有两种办法&#xff0c;第一种是将新增的…...

低代码开发:数字赋能智能制造的未来

随着数字化转型的深入推进&#xff0c;智能制造已经成为我国制造业发展的重要方向。在这个过程中&#xff0c;低代码开发作为一种高效、便捷的编程方式&#xff0c;正逐渐成为企业数字化转型的得力助手。本文将探讨低代码开发在智能制造领域的应用及价值。 智能制造的挑战 随着…...

janus-gateway的videoroom插件的RTP包录制功能源码详解

引: janus-gateway在配置文件设置后&#xff0c;可以实现对videoroom插件的每个publisher的音频&#xff0c;视频&#xff0c;数据的RTP流录制成mjr文件。 对于音频&#xff0c;视频的mjr文件&#xff0c;可以使用自带的postprocessing工具janus-pp-rec转成mp4文件。 每个pu…...

nginx+keepalived实现nginx高可用集群以及nginx实现Gateway网关服务集群

一、前言 1、简介 Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;被广泛使用。且现如今很多高并发场景需要后端服务集群部署&#xff0c;因此nginx也需要支持集群部署从而避免单点故障的问题。 本文将详细介绍使用 KeepalivedNginx 来实现Nginx的高可用集群和N…...

主键、外键、建表范式、MySQL索引、用户管理

1 案例1&#xff1a;主键 1.1 问题 完成如下练习&#xff1a; 练习主键的创建、查看、删除、添加、验证主键练习复合主键的使用练习与auto_increment连用的效果 1.2 方案 主键使用规则&#xff1a; 表头值不允许重复&#xff0c;不允许赋NULL值一个表中只能有一个primary…...

探究前端路由hash和history的实现原理(包教包会)

今天我们来讲一讲前端中很重要的一个部分路由&#xff08;router&#xff09;&#xff0c;想必前端小伙伴对‘路由’一词都不会感到陌生。但是如果哪天面试官问你&#xff0c;能大概说一说前端路由的实现原理吗&#xff1f; 你又会如何应对呢&#xff1f; 今天勇宝就带着大家一…...

幻兽帕鲁服务器多少钱?有买过的吗?

幻兽帕鲁服务器多少钱&#xff1f;太卷了&#xff0c;降价到24元1个月&#xff0c;阿里云4核16G10M游戏服务器26元1个月、149元半年&#xff0c;腾讯云4核16G游戏服务器32元、312元一年&#xff0c;华为云26元&#xff0c;京东云主机也是26元起。云服务器吧yunfuwuqiba.com给大…...

MCU独立按键单控LED实现

##江科大视频学习&#xff0c;并且对具体的一些小细节进行更详细的分析。 什么是独立按键&#xff1f; 轻触按键:相当于是一种电子开关&#xff0c;按下开头接通&#xff0c;松开时开头断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 注意…...

[数据集][目标检测]游泳者溺水数据集VOC+YOLO格式2类别895张

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;895 标注数量(xml文件个数)&#xff1a…...

2402C++,C++使用单链列表

原文 #include <windows.h> #include <malloc.h> #include <stdio.h>//用于列表项的结构;第一个成员是SLIST_ENTRY结构,其他成员是数据.在此,数据只是测试 typedef struct _PROGRAM_ITEM {SLIST_ENTRY ItemEntry;ULONG Signature; } PROGRAM_ITEM, *PPROGR…...

《Docker极简教程》--Docker服务管理和监控--Docker服务的监控

Docker监控的必要性在于确保容器化环境的稳定性、性能和安全性。以下是几个关键原因&#xff1a; 性能优化和故障排除&#xff1a;监控可以帮助识别容器化应用程序的性能问题&#xff0c;并快速进行故障排除。通过监控关键指标&#xff0c;如CPU利用率、内存使用、网络流量等&…...

C++初阶 | [八] (下) vector 模拟实现

摘要&#xff1a;vector 模拟实现讲解&#xff08;附代码示例&#xff09;&#xff0c;隐藏的浅拷贝&#xff0c;迭代器失效 在进行 vector 的模拟实现之前&#xff0c;我们先粗略浏览一下 stl_vector.h 文件中的源码来确定模拟实现的大体框架。 这里提供一些粗略浏览源码的技巧…...

手把手教你用STM32F103的SPI2驱动FPGA(附Verilog从机代码)

STM32与FPGA的SPI通信实战&#xff1a;从硬件连接到代码调试全解析 在嵌入式系统开发中&#xff0c;处理器与可编程逻辑器件的协同工作变得越来越常见。STM32作为广泛使用的微控制器&#xff0c;与FPGA的高速通信是实现复杂系统功能的关键。本文将带你从零开始&#xff0c;完成…...

python passlib

# 聊聊 Python 里的密码管理工具&#xff1a;Passlib 在 Python 项目里处理用户密码&#xff0c;是件需要格外小心的事。密码不能明文存储&#xff0c;得加密&#xff0c;但加密的方式又有很多种&#xff0c;选错了或者用错了&#xff0c;都可能留下安全隐患。这些年&#xff0…...

别再被老视频的“毛边”困扰了!手把手教你用TW9912芯片搞定隔行转逐行(附原理详解)

告别隔行扫描困扰&#xff1a;TW9912芯片实战指南与画质优化 想象一下&#xff0c;当你翻出珍藏多年的家庭录像带&#xff0c;满怀期待地将其数字化后&#xff0c;却发现播放时画面布满锯齿和闪烁——这种失落感恐怕只有经历过的人才能体会。隔行扫描技术曾是电视黄金时代的基石…...

别再乱打拍了!从亚稳态到异步FIFO,手把手教你搞定FPGA跨时钟域信号处理

从亚稳态到异步FIFO&#xff1a;FPGA跨时钟域信号处理实战指南 在FPGA和数字IC设计中&#xff0c;跨时钟域信号处理是一个永恒的话题。每当项目进度紧张、调试压力增大时&#xff0c;工程师们最不愿看到的就是时序报告里那些令人头疼的违例警告。我曾在一个高速数据采集项目中…...

别再死记硬背论文了!用Python+Transformer复现医学报告生成SOTA模型(附代码)

用PythonTransformer实战医学报告生成&#xff1a;从论文到SOTA模型的完整复现指南 当你在PubMed或arXiv上读到那些指标惊艳的医学报告生成论文时&#xff0c;是否曾被复杂的模型架构图劝退&#xff1f;本文将以第三篇论文《Radiology Report Generation with General and Spec…...

别再用Docker镜像打包Dify客户端了!C# 14原生AOT单文件部署正在重构云原生交付范式(限时开放压测数据集)

第一章&#xff1a;Dify客户端云原生交付范式的演进与重构动因在AI应用规模化落地的背景下&#xff0c;Dify客户端从单体打包部署逐步转向以Kubernetes为核心的云原生交付体系。这一转变并非单纯的技术升级&#xff0c;而是应对多租户隔离、边缘协同推理、热插拔插件治理及跨云…...

Python实战:手把手教你解密并下载AES-128加密的M3U8视频流(附完整代码)

Python实战&#xff1a;手把手教你解密并下载AES-128加密的M3U8视频流&#xff08;附完整代码&#xff09; 最近在帮朋友处理一个在线教育平台的视频下载需求时&#xff0c;遇到了AES-128加密的M3U8视频流。这种加密方式在各大视频平台都很常见&#xff0c;但完整实现解密下载…...

别再踩坑了!Spring Boot项目里Jackson处理LocalDateTime的正确姿势(附完整配置代码)

Spring Boot项目中Jackson处理LocalDateTime的终极指南 如果你正在使用Spring Boot开发Java应用&#xff0c;并且遇到了LocalDateTime序列化的问题&#xff0c;那么这篇文章就是为你准备的。作为现代Java开发中最常用的日期时间API之一&#xff0c;LocalDateTime在JSON序列化时…...

DDR3 PHY设计避坑指南:当100MHz控制器遇上400MHz内存,如何解决读写效率下降问题?

DDR3 PHY设计实战&#xff1a;跨越100MHz与400MHz的时钟鸿沟 在嵌入式系统和网络设备开发中&#xff0c;内存带宽往往是性能瓶颈的关键所在。当控制器运行在100MHz而DDR3内存工作在400MHz时&#xff0c;这个4:1的时钟比例关系会引发一系列设计挑战。我曾在一个视频处理项目中亲…...

告别sudo!手把手教你无root权限在Linux服务器上源码编译安装PostgreSQL 14

告别sudo&#xff01;手把手教你无root权限在Linux服务器上源码编译安装PostgreSQL 14 在共享开发环境或受限权限的服务器上&#xff0c;数据库部署常常面临权限壁垒。想象这样一个场景&#xff1a;你刚拿到实验室服务器的普通账号&#xff0c;急需搭建PostgreSQL进行数据分析&…...