from django.shortcuts import render
from rest_framework.generics import ListAPIView, GenericAPIView
from rest_framework.filters import OrderingFilter
from drf_haystack.viewsets import HaystackViewSet
from rest_framework.response import Response
from .models import SKU, GoodsCategory
from .serializers import SKUSerializer, SKUIndexSerializer, ChannelSerializer, CategorySerializer
# Create your views here.
class CategoryView(GenericAPIView):
"""
类别
"""
queryset = GoodsCategory.objects.all()
def get(self, request, pk=None):
ret = dict(
cat1='',
cat2='',
cat3=''
)
category = self.get_object()
if category.parent is None:
# 当前类别为一级类别
ret['cat1'] = ChannelSerializer(category.goodschannel_set.all()[0]).data
elif category.goodscategory_set.count() == 0:
# 当前类别为三级
ret['cat3'] = CategorySerializer(category).data
cat2 = category.parent
ret['cat2'] = CategorySerializer(cat2).data
ret['cat1'] = ChannelSerializer(cat2.parent.goodschannel_set.all()[0]).data
else:
# 当前类别为二级
ret['cat2'] = CategorySerializer(category).data
ret['cat1'] = ChannelSerializer(category.parent.goodschannel_set.all()[0]).data
return Response(ret)
class SKUSearchViewSet(HaystackViewSet):
"""
SKU搜索
"""
index_models = [SKU]
serializer_class = SKUIndexSerializer
# /categories/(?P<category_id>\d+)/skus?page=xxx&page_size=xxx&ordering=xxx
class SKUListView(ListAPIView):
"""商品列表页:分页和排序"""
# 指定查询集:需要展示的列表数据,需要根绝条件过滤,category_id需要对应,还有必须是未下架的商品
# queryset = SKU.objects.all()
# 指定序列化器
serializer_class = SKUSerializer
# 这种写法,只对这个视图的分页有效
# pagination_class = '自定义的分页类,自己制定分页规则'
# 指定排序和过滤的后端:ordering=price(根据价格小到大) ordering=-price(根据价格大到小)
filter_backends = [OrderingFilter]
# 指定排序和过滤的字段:create_time=根据记录的时间排序,price=根据价格排序,sales=根据销量排序
ordering_fields = ('create_time', 'price', 'sales')
def get_queryset(self):
"""根据条件刷选出需要展示在列表界面的数据"""
category_id = self.kwargs.get('category_id')
return SKU.objects.filter(category_id=category_id, is_launched=True)
#-------------------------------------------------------------------------------
from rest_framework import serializers
from drf_haystack.serializers import HaystackSerializer
from .models import SKU, GoodsCategory, GoodsChannel
from .search_indexes import SKUIndex
class SKUSerializer(serializers.ModelSerializer):
"""序列化器序列化商品SKU信息"""
class Meta:
model = SKU
# 指定序列化的字段
fields = ('id', 'name', 'price', 'default_image_url', 'comments')
class SKUIndexSerializer(HaystackSerializer):
"""
SKU索引结果数据序列化器
"""
class Meta:
index_classes = [SKUIndex]
fields = ('text', 'id', 'name', 'price', 'default_image_url', 'comments')
class CategorySerializer(serializers.ModelSerializer):
"""
类别序列化器
"""
class Meta:
model = GoodsCategory
fields = ('id', 'name')
class ChannelSerializer(serializers.ModelSerializer):
"""
频道序列化器
"""
category = CategorySerializer()
class Meta:
model = GoodsChannel
fields = ('category', 'url')
#utils-------------------------------------------------------
from collections import OrderedDict
from .models import GoodsChannel
def get_categories():
"""
获取商城商品分类菜单
:return 菜单字典
"""
# 商品频道及分类菜单
# 使用有序字典保存类别的顺序
# categories = {
# 1: { # 组1
# 'channels': [{'id':, 'name':, 'url':},{}, {}...],
# 'sub_cats': [{'id':, 'name':, 'sub_cats':[{},{}]}, {}, {}, ..]
# },
# 2: { # 组2
#
# }
# }
categories = OrderedDict()
channels = GoodsChannel.objects.order_by('group_id', 'sequence')
for channel in channels:
group_id = channel.group_id # 当前组
if group_id not in categories:
categories[group_id] = {'channels': [], 'sub_cats': []}
cat1 = channel.category # 当前频道的类别
# 追加当前频道
categories[group_id]['channels'].append({
'id': cat1.id,
'name': cat1.name,
'url': channel.url
})
# 构建当前类别的子类别
for cat2 in cat1.goodscategory_set.all():
cat2.sub_cats = []
for cat3 in cat2.goodscategory_set.all():
cat2.sub_cats.append(cat3)
categories[group_id]['sub_cats'].append(cat2)
return categories
django--goods
猜你喜欢
转载自blog.csdn.net/SkyJianWei/article/details/82086125
今日推荐
周排行