一. 使用APIView方法获取商品信息列表:需要手动获取数据比较麻烦
1. 新建序列化器(marketserializer.py)
from rest_framework import serializers
from App.models import CccFoodtype, CccGoods
class GoodTypeSreializer(serializers.ModelSerializer):
class Meta:
model = CccFoodtype
fields = "__all__"
class GoodsSerializer(serializers.ModelSerializer):
class Meta:
model = CccGoods
fields = "__all__"
2. 获取路由
from django.urls import path
from market import views
app_name='market'
urlpatterns = [
# 商品类型列表
path('goodtype/', views.GoodTypeListView.as_view(),name='goodtype'),
# 商品信息列表
path('market/', views.GoodsListView.as_view(),name='market'),
]
3. 编写视图函数
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
from App.models import *
# Create your views here.
from Ccc import settings
from market.goodfilter import GoodFilter
from market.marketserializer import GoodTypeSreializer, GoodsSerializer
class GoodTypeListView(APIView):
def get(self, request):
# 获取商品类型
queryset = CccFoodtype.objects.all()
# 序列化
goodtype_serializer = GoodTypeSreializer(queryset, many=True)
print(goodtype_serializer)
return Response({
"code": 200,
"msg": "请求成功",
"data": goodtype_serializer.data
})
class GoodsListView(APIView):
def get(self, request, *args, **kwargs):
# typeid:商品类型id
# childcid: 子类id
# order_rule: 排序规则
params = request.query_params # get传参使用query_params获取
# print(params)
tid = request.query_params.get('typeid')
# 商品列表
goods_list = CccGoods.objects.filter(categoryid=int(tid))
# 过滤子类商品
childcid = int(request.query_params.get('childcid'))
if childcid > 0:
goods_list = goods_list.filter(childcid=childcid)
# 对结果排序
rulle_type = request.query_params.get('rulle_type',0)
if rulle_type == "1":
goods_list = goods_list.order_by('price')
elif rulle_type == "2":
goods_list = goods_list.order_by('-price')
elif rulle_type == "3":
goods_list = goods_list.order_by('productnum')
elif rulle_type == "4":
goods_list = goods_list.order_by('-productnum')
# 序列化
goods_serializer = GoodsSerializer(instance=goods_list, many=True)
goods_list = goods_serializer.data
print(goods_list)
# 商品分类子类列表
goodstype = CccFoodtype.objects.filter(typeid=int(tid)).first()
childtypenames = goodstype.childtypenames # 子类名称
childtypenames = childtypenames.split("#")
childtypenames = [value.split(":") for value in childtypenames]
childtypenames = [{'child_name:': ele[0], 'child_value': ele[1]} for ele in childtypenames]
return Response({
"code": 200,
"msg": "ok",
"data": {
"good_list": goods_list,
"order_rule_list": settings.ORDER_RULT_LIST,
"foodtype_childname_lichild_name": childtypenames
}
})
二. 使用ListAPIView方法获取商品信息列表:比较简单
1. 新建过滤文件(goodfilter.py)
from django_filters import rest_framework as filters
from App.models import CccGoods
class GoodFilter(filters.FilterSet):
# 针对的是结果集,不是数据库
# 自定义字段: field_name与数据库对应的是哪个字段
typeid = filters.CharFilter(field_name="categoryid", lookup_expr='exact')
childcid = filters.CharFilter(field_name="childcid", method='filter_child_type')
order_rule = filters.CharFilter(field_name="order_rule", method='order_goods')
class Meta:
model = CccGoods
fields = ['categoryid']
def filter_child_type(self, queryset, name, value):
print(value, type(value))
if int(value) > 0: # value大于0,说明要进行子类过滤
return queryset.filter(childcid=int(value))
# 如果value为0,说明没有子类
return queryset
def order_goods(self, queryset, name, value):
value = int(value)
# 对结果排序
if value == 1:
queryset = queryset.order_by('price')
elif value == 2:
queryset = queryset.order_by('-price')
elif value == 3:
queryset = queryset.order_by('productnum')
elif value == 4:
queryset = queryset.order_by('-productnum')
return queryset
2. views.py
class GoodsListView(ListAPIView):
queryset = CccGoods.objects.all()
serializer_class = GoodsSerializer
filter_class = GoodFilter # 过滤器
def list(self, request, *args, **kwargs):
# filter_queryset使用过滤器对查询结果集过滤
queryset = self.filter_queryset(self.get_queryset())
# 序列化
serializer = self.get_serializer(queryset, many=True)
# 商品分类子类列表
tid = request.query_params.get('typeid')
goodstype = CccFoodtype.objects.filter(typeid=int(tid)).first()
childtypenames = goodstype.childtypenames # 子类名称
childtypenames = childtypenames.split("#")
childtypenames = [value.split(":") for value in childtypenames]
childtypenames = [{'child_name:': ele[0], 'child_value': ele[1]} for ele in childtypenames]
#
return Response({
"code": 200,
"msg": "ok",
"data": {
"good_list": serializer.data,
"order_rule_list": settings.ORDER_RULT_LIST,
"foodtype_childname_lichild_name": childtypenames
}
})