django 商品及购物车逻辑实现

基于类视图模式实现商品分类菜单接口开发

创建菜单子应用

python 复制代码
python manage.py startapp menu

测试

apps/menu/views

python 复制代码
from django.http import HttpResponse
from django.views import View


class GoodsMainMenu(View):
    def get(self,request):
        print("get请求")
        return HttpResponse("get 请求")

    def post(self,request):
        print("post请求")
        return HttpResponse("post 请求")

muxi_shop_back/urls

python 复制代码
path("main_menu/", GoodsMainMenu.as_view()),

这时候测试请求

setting

把csrf中间件注释了

python 复制代码
MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    # "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

接近cors跨域问题

python 复制代码
# 解决跨域的一个插件
# pip install django-cors-headers
# 允许所有域名跨域
CORS_ORIGIN_ALLOW_ALL=True
# 允许携带cookie
CORS_ALLOW_CREDENTIALS=True

解决办法

获取一级菜单列表

获取二级菜单列表

封装统一的返回格式

utils/ResponseMessage

python 复制代码
import json

from django.http import HttpResponse, JsonResponse


# 我们的菜单成功了状态码就是1000
# 失败了就是1001
# 其它不确定的1002
class MenuResponse():

    @staticmethod
    def success(data):
        result = {"status":1000,"data":data}
        return HttpResponse(json.dumps(result), content_type = "application/json")

    @staticmethod
    def failed(data):
        result = {"status": 1001, "data": data}
        return HttpResponse(json.dumps(result), content_type="application/json")

    @staticmethod
    def other(data):
        result = {"status": 1002, "data": data}
        return HttpResponse(json.dumps(result), content_type="application/json")
# 商品的响应全部都是2开头的
class GoodsResponse():

    @staticmethod
    def success(data):
        result = {"status":2000,"data":data}
        return HttpResponse(json.dumps(result), content_type = "application/json")

    @staticmethod
    def failed(data):
        result = {"status": 2001, "data": data}
        return HttpResponse(json.dumps(result), content_type="application/json")

    @staticmethod
    def other(data):
        result = {"status": 2002, "data": data}
        return HttpResponse(json.dumps(result), content_type="application/json")


# 购物车的响应全部都是3开头的
class CartResponse():

    @staticmethod
    def success(data):
        result = {"status":3000,"data":data}
        return JsonResponse(result,safe=False)

    @staticmethod
    def failed(data):
        result = {"status": 3001, "data": data}
        return JsonResponse(result, safe=False)

    @staticmethod
    def other(data):
        result = {"status": 3002, "data": data}
        return JsonResponse(result, safe=False)


# 用户的响应全部都是4开头的
class UserResponse():

    @staticmethod
    def success(data):
        result = {"status":4000,"data":data}
        return JsonResponse(result,safe=False)

    @staticmethod
    def failed(data):
        result = {"status": 4001, "data": data}
        return JsonResponse(result, safe=False)

    @staticmethod
    def other(data):
        result = {"status": 4002, "data": data}
        return JsonResponse(result, safe=False)

可以修改为

APIView继承实现商品类型接口开发

鼠标移动到不同的商品类型显示其对应的商品

goods/models

python 复制代码
import decimal

from django.db import models
import json

from muxi_shop_back.settings import IMAGE_URL


class Goods(models.Model):
    type_id = models.IntegerField(blank=True, null=True)
    name = models.CharField(max_length=255, blank=True, null=True)
    sku_id = models.CharField(max_length=255, blank=True, null=True)
    target_url = models.CharField(max_length=255, blank=True, null=True)
    jd_price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    p_price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    image = models.CharField(max_length=255, blank=True, null=True)
    shop_name = models.CharField(max_length=255, blank=True, null=True)
    shop_id = models.IntegerField(blank=True, null=True)
    spu_id = models.CharField(max_length=255, blank=True, null=True)
    mk_price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    vender_id = models.IntegerField(blank=True, null=True)
    find = models.IntegerField(blank=True, null=True)
    create_time = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        result = {}
        result['type_id']=self.type_id
        result['name']=self.name
        result['sku_id']=self.sku_id
        result['target_url']=self.target_url
        result['jd_price']=self.jd_price
        result['p_price']=self.p_price
        result['image']= IMAGE_URL + self.image
        result['shop_name']=self.shop_name
        result['shop_id']=self.shop_id
        result['spu_id']=self.spu_id
        result['mk_price']=self.mk_price
        result['vender_id']=self.vender_id
        result['find']=self.find
        return json.dumps(result,cls=DecimalEncoder, ensure_ascii=False)

    class Meta:
        managed = False
        db_table = 'goods'

class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o,decimal.Decimal):
            return float(o)

goods/urls

python 复制代码
from django.urls import path

from .views import GoodsCategoryAPIView


urlpatterns = [
    path("category/<int:category_id>/<int:page>",GoodsCategoryAPIView.as_view()),

]

goods/views

python 复制代码
from rest_framework.views import APIView

# APIView 继承了View
# 获取商品分类的接口
#访问方式 http://localhost:8000/goods/category/1
from apps.goods.models import Goods
from utils import ResponseMessage


class GoodsCategoryAPIView(APIView):
    def get(self,request,category_id,page):
        current_page = (page-1)*20
        end_data = page*20
        category_data = Goods.objects.filter(type_id=category_id).all()[current_page:end_data]
        result_list=[]
        for m in category_data:
            result_list.append(m.__str__())
        return ResponseMessage.GoodsResponse.success(result_list)

urls

python 复制代码
from django.contrib import admin
from django.urls import path, include

from apps.menu.views import GoodsMainMenu,GoodsSubMenu


urlpatterns = [
    path("admin/", admin.site.urls),
    path("main_menu/", GoodsMainMenu.as_view()),
    path("sub_menu/", GoodsSubMenu.as_view()),
    path("goods/",include("goods.urls"))
]

setting

python 复制代码
# 静态文件服务器配置
IMAGE_URL = "http://localhost:8000/static/product_images/"

序列化起实现商品详情数据查询接口

使用商品表的su_id 查询

在商品分类中任意点击一个商品进入就能看到该商品的商品详情

goods/views.py

python 复制代码
class GoodsDetailAPIView(APIView):
    def get(self,request,sku_id):
        print(sku_id)
        goods_data = Goods.objects.filter(
            sku_id=sku_id
        ).first()
        # 进行序列化的动作 序列化的参数时instance, 反序列化的参数就是data
        result = GoodsSerializer(instance=goods_data)

        return ResponseMessage.GoodsResponse.success(result.data)

goods/urls

python 复制代码
path("<str:sku_id>",GoodsDetailAPIView.as_view()),

goods/serializers.py

python 复制代码
from rest_framework import serializers
from apps.goods.models import Goods
from muxi_shop_back.settings import IMAGE_URL

class GoodsSerializer(serializers.ModelSerializer):
    # 这里边写的字段就是你想要进行序列化时处理的字段
    # name = serializers.CharField()
    # 对序列化中的图片做处理
    image = serializers.SerializerMethodField()
    # 对序列化中的日期做处理
    create_time = serializers.DateTimeField("%Y-%m-%d %H:%M:%S")

    # 自动调用该方法  把 new_image_path 赋值给image   比如给序列化字段image做处理image前面加get
    def get_image(self,obj):
        new_image_path = IMAGE_URL + obj.image
        return new_image_path

    class Meta:
        model = Goods
        fields = "__all__"

不知道该序列化什么

python 复制代码
    class Meta:
    	# 指定序列化的类
        model = Goods
        # 序列化所有的字段
        fields = "__all__"

1,2两种序列化都可以实现数据的返回

购物车接口开发--实现数据的添加

cart/views

python 复制代码
from django.http import HttpResponse

from rest_framework.views import APIView
from apps.cart.models import Cart
from apps.cart.serializers import CartSerializer
class CartAPIView(APIView):
    # 购物车应该登录之后才能访问

    def post(self,request):
        request_data = request.data
        email = request_data.get("email")
        sku_id = request_data.get('sku_id')
        nums = request_data.get('nums')

        # 判断数据是否存在  如果存在就更新,如果不存在就插入
        data_exists = Cart.objects.filter(email=email,is_delete = 0,sku_id=sku_id)
        # 存在即更新
        if data_exists.exists():
            exists_cart_data = data_exists.get(email=email,is_delete = 0,sku_id=sku_id)
            new_nums = nums + exists_cart_data.nums
            request_data["nums"] = new_nums
            # 反序列化  json转对象
            cart_ser = CartSerializer(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            # 更新
            Cart.objects.filter(
                email=email, is_delete=0, sku_id=sku_id
            ).update(**cart_ser.data)
            return ResponseMessage.CartResponse.success("更新成功")
        else:
            # 不存在插入
            cart_ser = CartSerializer(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            Cart.objects.create(**cart_ser.data)
            return ResponseMessage.CartResponse.success("插入成功")

cart/urls

python 复制代码
from django.urls import path
from .views import CartAPIView


urlpatterns = [
    path("",CartAPIView.as_view()),

]

cart/serializers.py

python 复制代码
from rest_framework import serializers

from apps.cart.models import Cart


class CartSerializer(serializers.ModelSerializer):
    sku_id = serializers.CharField(required=True)
    # email本身设置的是唯一的  所以这里重新设置一下覆盖掉
    email = serializers.CharField(required=True)
    class Meta:
        model = Cart
        fields = "__all__"

cart/models

python 复制代码
from django.db import models

# Create your models here.
class Cart(models.Model):
    id = models.AutoField(primary_key=True,null=False,unique=True)
    email =  models.CharField(null=False,max_length=255,unique=True)
    sku_id = models.CharField(null=False,max_length=255,unique=True)
    nums = models.IntegerField()
    is_delete = models.IntegerField()
    class Meta:
        db_table="shopping_cart"

购物车接口开发 数据的查询

cart/views

python 复制代码
    def get(self, request):
        email = request.GET.get("email")
        cart_result = Cart.objects.filter(email=email,is_delete=0)
        # many=True 返回多条
        cart_ser = CartSerializer(instance=cart_result,many=True)
        # return JsonResponse(cart_ser.data,safe=False)
        return ResponseMessage.CartResponse.success(cart_ser.data)

购物车查询接口Bug修复及数据逻辑删除

cart/views

python 复制代码
class CartAPIView(APIView):
    # 购物车应该登录之后才能访问

    def post(self, request):
        request_data = request.data
        email = request_data.get("email")
        sku_id = request_data.get('sku_id')
        nums = request_data.get('nums')
        is_delete = request_data.get('is_delete')

        # 判断数据是否存在  如果存在就更新,如果不存在就插入
        data_exists = Cart.objects.filter(email=email, is_delete=0, sku_id=sku_id)
        # 存在即更新
        if data_exists.exists():
            exists_cart_data = data_exists.get(email=email, is_delete=0, sku_id=sku_id)
            if is_delete == 0:
                new_nums = nums + exists_cart_data.nums
                request_data["nums"] = new_nums
            elif is_delete == 1:
                new_nums = nums + exists_cart_data.nums
            # 反序列化  json转对象
            cart_ser = CartSerializer(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            # 更新
            Cart.objects.filter(
                email=email, is_delete=0, sku_id=sku_id
            ).update(**cart_ser.data)
            if is_delete == 0:
                return ResponseMessage.CartResponse.success("更新成功")
            elif is_delete == 1:
                return ResponseMessage.CartResponse.success("删除成功")
        else:
            # 不存在插入
            cart_ser = CartSerializer(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            Cart.objects.create(**cart_ser.data)
            return ResponseMessage.CartResponse.success("插入成功")
相关推荐
奔跑吧邓邓子3 分钟前
【Python爬虫(36)】深挖多进程爬虫性能优化:从通信到负载均衡
开发语言·爬虫·python·性能优化·负载均衡·多进程
学长学姐我该怎么办28 分钟前
年前集训总结python
python
量化投资技术36 分钟前
【量化科普】Sharpe Ratio,夏普比率
python·量化交易·量化·量化投资·qmt·miniqmt
yanglamei196237 分钟前
基于Python+Django+Vue的旅游景区推荐系统系统设计与实现源代码+数据库+使用说明
vue.js·python·django
虚假程序设计40 分钟前
python用 PythonNet 从 Python 调用 WPF 类库 UI 用XAML
python·ui·wpf
胡桃不是夹子1 小时前
CPU安装pytorch(别点进来)
人工智能·pytorch·python
不会玩技术的技术girl3 小时前
使用Python和正则表达式爬取网页中的URL数据
开发语言·python·正则表达式
阿_旭3 小时前
基于YOLO11深度学习的糖尿病视网膜病变检测与诊断系统【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·视网膜病变检测
胖哥真不错3 小时前
Python实现GO鹅优化算法优化随机森林分类模型项目实战
python·机器学习·项目实战·go鹅优化算法·随机森林分类模型
小白今天也很酷4 小时前
Python与MCU通信:串口数据采集及CSV/Excel存储方法
python·单片机·excel