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

创建菜单子应用

python manage.py startapp menu

测试

apps/menu/views

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

path("main_menu/", GoodsMainMenu.as_view()),

这时候测试请求

setting 把csrf中间件注释了

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跨域问题

# 解决跨域的一个插件

# pip install django-cors-headers

# 允许所有域名跨域

CORS_ORIGIN_ALLOW_ALL=True

# 允许携带cookie

CORS_ALLOW_CREDENTIALS=True

解决办法

获取一级菜单列表

获取二级菜单列表

封装统一的返回格式 utils/ResponseMessage

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

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

from django.urls import path

from .views import GoodsCategoryAPIView

urlpatterns = [

path("category//",GoodsCategoryAPIView.as_view()),

]

goods/views

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

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

# 静态文件服务器配置

IMAGE_URL = "http://localhost:8000/static/product_images/"

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

使用商品表的su_id 查询 在商品分类中任意点击一个商品进入就能看到该商品的商品详情 goods/views.py

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

path("",GoodsDetailAPIView.as_view()),

goods/serializers.py

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__"

不知道该序列化什么

class Meta:

# 指定序列化的类

model = Goods

# 序列化所有的字段

fields = "__all__"

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

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

cart/views

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

from django.urls import path

from .views import CartAPIView

urlpatterns = [

path("",CartAPIView.as_view()),

]

cart/serializers.py

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

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

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

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("插入成功")

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: