一. 使用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
            }
        })