1、处理商品的分类
2、目录会有两个接口
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