【Django REST framework电商项目笔记】第06章 商品类别功能

将drf返回的数据映射到vue界面思路

1、处理商品的分类
2、目录会有两个接口

  • 一个是全部数据的接口,用于首页的全部分类,一级-二级-三级
  • 另一个是获取某一类的分类,以及商品数量
    3、为商品通过大类进行过滤条件的过滤。价格,销量的排序,分页

开发商品类别接口

1、商品类别序列化:

class CategorySerializer(serializers.ModelSerializer):
    """
    商品类别序列化
    """
    class Meta:
        model = GoodsCategory
        fields = "__all__"

2、对分类进行筛选

class CategoryViewSet(mixins.ListModelMixin,
                      mixins.RetrieveModelMixin,
                      viewsets.GenericViewSet):
    """
    list:   商品分类列表数据
    retrieve:  获取商品分类详情
    """
    #上面的注释要写清楚,才能让后面生成文档更方便
    queryset = GoodsCategory.objects.filter(category_type=1)
    serializer_class = CategorySerializer

3、配置 url

router = DefaultRouter()

# 配置商品列表的路由
router.register(r'goods', GoodsAllViewSet, base_name="goods")

# 配置商品分类的路由
router.register(r'category', CategoryViewSet, base_name="category")

我这里是/category,老师的 vue 文件配置的 url 貌是 /categories,注意比较是否相同

如何让一类数据包括二类数据

Serializer 中添加三级分类的 Serializer

"""
goods的外键category --> 直接嵌套展示category表中的字段
通过嵌套的方式实现序列化
"""
class CategorySerializer3(serializers.ModelSerializer):
    class Meta:
        model = GoodsCategory
        fields = "__all__"


class CategorySerializer2(serializers.ModelSerializer):
    sub_cat = CategorySerializer3(many=True)
    class Meta:
        model = GoodsCategory
        fields = "__all__"


class CategorySerializer(serializers.ModelSerializer):
    """
    通过related_name的sub_cat调用
    """
    sub_cat = CategorySerializer2(many=True)
    class Meta:
        model = GoodsCategory
        fields = "__all__"
        

这里的 sub_cat 是因为我们在自身的继承关系中将这种关系进行了命名
goods 的 models.py:

    parent_category = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, verbose_name="父类目级别", help_text="父目录",
                                        related_name="sub_cat")

因为我们此时通过一类拿到的二类有很多,所以必须加上 many = True 的参数

问题又来了: 现在我们获取的是所有的category,如何获取具体某一个下面的。
点击生鲜食品,左侧出现的是生鲜食品下面的具体分类。
目标: 获取列表页里面的详情页
让我们的 CategoryViewSet 多继承一个 mixins.retrievemodelmixin

这里我们需要遵循restful api 对于某一个商品详情获取的推荐

GET /category/ID:获取某个指定分类的信息

其实这个工作 viewset 已经帮我们做了,一但我们进行了register的注册。只要我们继承了 RetrieveModelMixin 就可以直接通过id进行获取。
http://127.0.0.1:8000/category/1/

设置服务器完成跨域

安装 django-cors-headers

pip install django-cors-headers

添加进安装的app中

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

添加到 settings 的中间件 middleware 中,要放在 CsrfViewMiddleware 之前

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',    # 跨域中间件配置
    'django.middleware.csrf.CsrfViewMiddleware',
    ...
]

添加参数为 true 及设置白名单

CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
    '127.0.0.1:3000'
)

view 中将分页的参数修改为 page 与前端 vue 保持一致

    page_query_param = "page"

参数top_category就是我们的第一级别。它是将我们参数中的id值传入
因此在后台我们也需要配套的做一个category的过滤器
如何获取一级分类下的所有商品
goods/filters.py:class GoodsFilter

 top_category = filters.NumberFilter(method="top_category_filter")

    def top_category_filter(self, queryset, name, value):
        return queryset.filter(Q(category_id=value) |
                               Q(category__parent_category_id=value) |
                               Q(category__parent_category__parent_category_id=value))

然后将 queryset return 回去
pricemin 以及 pricemax 与我们的前端代码中的一致
所以修改goods/filters.py中的与前端保持一致
分页数据中会自带一个count值

设置分页size与前端保持一致

class GoodsPagination(PageNumberPagination):
    """
    商品列表分页
    """

    page_size = 12
    page_size_query_param = 'page_size'
    page_query_param = 'page'
    max_page_size = 100
    

你可能感兴趣的:(Django)