其实应该先配置spu在配置sku
根据教材上的颠倒了一下
跟配置sku的博客一样
其中关联了品牌表跟商品种类表
from django.db import models
# spu 表
class SPUS(models.Model):
name=models.CharField('spu',max_length=20)
# #绑定品牌表
brand=models.ForeignKey(Brand,on_delete=models.CASCADE,verbose_name='所属品牌')
# #商品种类表 #反向查询可以直接调用
category1=models.ForeignKey(Cate,on_delete=models.CASCADE,related_name='cate1_spu',verbose_name='一级类别')
category2=models.ForeignKey(Cate,on_delete=models.CASCADE,related_name='cate2_spu',verbose_name='二级类别')
category3=models.ForeignKey(Cate,on_delete=models.CASCADE,related_name='cate3_spu',verbose_name='三级类别')
comment_num=models.IntegerField('评论量',default=0)
sales=models.IntegerField('销量',default=0)
desc_detail=models.TextField('详细描述',default='')
desc_pack=models.TextField('包装信息',default='')
desc_service=models.TextField('售后服务',default='')
def __str__(self):
return self.name
class Meta:
db_table='spu'
# 'sku' 商品表
class SKUS(models.Model):
name=models.CharField('sku',max_length=100)
describe=models.CharField('商品描述',max_length=500)
price=models.DecimalField('价格',decimal_places=2,max_digits=8)
stick=models.IntegerField('库存',default=0)
sales=models.IntegerField('销量',default=0)
detail=models.TextField('详情',default='')
image_default=models.CharField('默认图片',max_length=300,default='')
is_selling=models.BooleanField('是否在售',default=True) #布尔类型
# #绑定商品种类表
cate=models.ForeignKey(Cate,on_delete=models.CASCADE,verbose_name='一级类别')
# #绑定spu表
spu=models.ForeignKey(SPUS,on_delete=models.CASCADE,verbose_name='所属SPU')
def __str__(self):
return self.name
class Meta:
db_table='sku'
verbose_name_plural='商品sku'
创建序列化器
from rest_framework import serializers
from .models import *
#SKU模型类的序列化器
class SKUSer(serializers.ModelSerializer):
cate_name=serializers.SerializerMethodField(read_only=True)
def get_cate_name(self,obj):
return obj.cate.name
class Meta:
model=SKUS
fields='__all__'
read_only_fields=['id','detail','image_default','sales']
#SPU模型类的序列化器
class SPUSer(serializers.ModelSerializer):
brand_name=serializers.SerializerMethodField(read_only=True)
def get_brand_name(self,obj):
return obj.brand.name
class Meta:
model=SPUS
fields='__all__'
read_only_fields=['id']
编写视图类
子级类别的视图根据id获取对应id下的全部数据
一级,二级,三级 cate商品种类表
#子级类别的视图
class SubCatesAPIView(RetrieveUpdateDestroyAPIView):
queryset = Cate.objects.all()
serializer_class = GoodsCateSer
lookup_field = 'pk'
lookup_url_kwarg = 'pk'
def retrieve(self, request, *args, **kwargs):
#获取父级类别对象
# /v1/goods/channels/subCate/1/
parent_obj=self.get_object()
#根据父级类别,获取子级类别
subs_queryset=parent_obj.subs.all()
#子级类别序列化
ser=self.get_serializer(subs_queryset,many=True)
#返回响应
return Response(ser.data)
# sku视图集
class SKUAPIView(ModelViewSet):
queryset = SKUS.objects.all()
serializer_class = SKUSer
lookup_field = 'pk'
lookup_url_kwarg = 'pk'
#spu的视图
class SPUAPIView(ModelViewSet):
queryset = SPUS.objects.all()
serializer_class = SPUSer
lookup_field = 'pk'
lookup_url_kwarg = 'pk'
pagination_class = MyPagination
#又一个加载所有品牌的视图,避免分页器导致数据不全
class BarabdsAllAPIView(ListAPIView):
queryset = Brand.objects.all()
serializer_class = BrandSer
配置路由
from django.urls import path
from rest_framework import routers
from .views import *
urlpatterns = [
#上传logo
#频道组的接口,获取所有、新增一个
path('channels/',ListCreateGroupAPIView.as_view()),
#频道组的接口,检索,更改,删除
path('channels//',ReUpDeAPIViwe.as_view()),
#加载所有的一级类别
path('channels/firstcates/',FirstCateAPIView.as_view()),
#加载子级类别
path('channels/subCates//',SubCatesAPIView.as_view()),
#加载所有的品牌数据
path('brands/all/',BarabdsAllAPIView.as_view()),
]
#品牌的路由
router=routers.SimpleRouter()
router.register('brands',BrandViewSet,'brands')
router.register('skus',SKUAPIView,'skus')
router.register('spus',SPUAPIView,'spus')
urlpatterns+=router.urls
前端
找到对应的veu组件,进行配置
实现sku的增删改查
例如:Spu.vue 获取全部数据
例如:SpuTable.vue进行展示修改数据
修改事件中的路由,字段等
例如:SpuEdit.vue进行修改数据
修改事件中的路由,字段等
添加绑定外键的字段实现下拉框添加
添加跟修改获取数据类似



