网站设计模板怎么使用,上海抖音seo公司,备案域名出售,北京黄页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… 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_length15,blankTrue,nullTrue)image models.CharField(verbose_name图片链接, help_text图片链接, max_length200, blankTrue, nullTrue)status models.BooleanField(verbose_name是否启用, help_text是否启用, defaultFalse,blankTrue,nullTrue)class Meta:db_table goods_groupverbose_name 商品分类表verbose_name_plural verbose_namedef __str__(self):return self.nameclass Goods(BaseModel):商品group models.ForeignKey(GoodsGroup, verbose_name分类, help_text分类, max_length15, on_deletemodels.CASCADE)image models.CharField(verbose_name图片链接, help_text图片链接, max_length200, blankTrue, nullTrue)title models.CharField(verbose_name标题, help_text标题, max_length20, blankTrue,nullTrue)desc models.CharField(verbose_name商品描述, help_text商品描述, max_length200, blankTrue,nullTrue)price models.DecimalField(verbose_name商品价格, help_text商品价格, max_digits10, decimal_places2, blankTrue,nullTrue)cover models.ImageField(verbose_name封面图链接, help_text封面图链接, max_length200, blankTrue,nullTrue)stock models.IntegerField(verbose_name库存, help_text库存, blankTrue, nullTrue, default1)sales models.IntegerField(verbose_name销量, help_text销量, blankTrue, nullTrue, default0)is_on models.BooleanField(verbose_name是否上架, help_text是否上架, blankTrue, nullTrue, defaultFalse)recommend models.BooleanField(verbose_name是否推荐, help_text是否推荐, blankTrue, nullTrue, defaultFalse)class Meta:db_table goodsverbose_name 商品表verbose_name_plural verbose_namedef __str__(self):return self.titleclass Detail(BaseModel):商品详情goods models.OneToOneField(Goods, verbose_name商品, on_deletemodels.CASCADE, max_length200)producer models.CharField(verbose_name厂商, help_text厂商, max_length200, blankTrue,nullTrue)norms models.CharField(verbose_name规格, help_text规格, max_length200, blankTrue,nullTrue)details RichTextField(verbose_name商品详情, help_text商品详情, max_length200,blankTrue,nullTrue)class Meta:db_table detailsverbose_name 详情verbose_name_plural verbose_namedef __str__(self):return self.goodsclass GoodsBanner(BaseModel):商品轮播图title models.CharField(verbose_name轮播图名称, help_text轮播图名称, max_length20, blankTrue)image models.ImageField(verbose_name轮播图链接, help_text轮播图链接, max_length200, blankTrue)# url models.CharField(verbose_name跳转的地址,help_text跳转的地址,max_length200,blankTrue)status models.BooleanField(verbose_name是否启用, help_text是否启用, defaultFalse,blankTrue,nullTrue)seq models.IntegerField(verbose_name顺序, help_text顺序, default1, blankTrue,nullTrue)class Meta:db_table bannerverbose_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_deletemodels.CASCADE,blankTrue,nullTrue)goods models.ForeignKey(goods.Goods, help_text商品ID, verbose_name商品ID, on_deletemodels.CASCADE,blankTrue,nullTrue)class Meta:db_table collectverbose_name 收藏商品verbose_name_plural verbose_namedef __str__(self):return self.goodsDjango自带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(statusTrue)groupSer GoodsGroupSerializer(group,manyTrue)# 轮播图banner GoodsBanner.objects.filter(statusTrue)bannerSer GoodsBannerSerializer(banner,manyTrue)# 推荐的商品goods Goods.objects.filter(recommendTrue)goodsSer GoodsSerializer(goods,manyTrue)# 返回数据result {banner: bannerSer.data,goods:goodsSer.data,group:groupSer.data}return Response({message:ok,data:result},statusstatus.HTTP_200_OK)# 商品首页
path(index/, IndexView.as_view()),
商品列表获取和分类排序接口
# view
class GoodsView(ReadOnlyModelViewSet):商品列表接口serializer_class GoodsSerializer# 选择上架的商品queryset Goods.objects.filter(is_onTrue),# 实现商品分类和推荐类过滤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:你没有用户权限访问该信息},statusstatus.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(userrequest.user)serializer self.get_serializer(queryset, manyTrue)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(useruser,goodsgoods):# 该商品存在cart_goods Cart.objects.get(useruser,goodsgoods)cart_goods.number 1cart_goods.save()# 商品序列化serializer self.get_serializer(cart_goods)return Response(serializer.data,statusstatus.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(userrequest.user)serializer self.get_serializer(query, manyTrue)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:修改成功},statusstatus.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: 数量不可超过该商品的库存数量}, statusstatus.HTTP_422_UNPROCESSABLE_ENTITY)elif number 0:obj.delete()return Response({message:修改成功,已删除},statusstatus.HTTP_200_OK)else:obj.number numberobj.save()return Response({message: 修改成功}, statusstatus.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商城的后端实现。