1.商品详情的实现只需让viewset再继承一个mixins.RetrieveModelMixin即可。
class GoodsListViewSet(CacheResponseMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
"""
商品列表页, 分页, 搜索, 过滤, 排序
"""
# throttle_classes = (UserRateThrottle, )
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
# authentication_classes = (TokenAuthentication, )
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
filter_class = GoodsFilter
search_fields = ('name', 'goods_brief', 'goods_desc')
ordering_fields = ('sold_num', 'shop_price')
2.配置serializer,因为商品的详情会显示图片所以需要在GoodsSerializer中实例化GoodsImageSerializer,实现序列化GoodsSerializer的同时返回图片的数据信息
class GoodsImageSerializer(serializers.ModelSerializer):
class Meta:
model = GoodsImage
fields = ("image", )
class GoodsSerializer(serializers.ModelSerializer):
category = CategorySerializer()
images = GoodsImageSerializer(many=True)
class Meta:
model = Goods
fields = "__all__"
3.热卖商品接口实现
只需要加一个热卖的过滤器就可以了,在filter中加一个“is_hot”
class GoodsFilter(django_filters.rest_framework.FilterSet):
"""
商品的过滤类
"""
pricemin = django_filters.NumberFilter(field_name='shop_price', help_text="最低价格",lookup_expr='gte')
pricemax = django_filters.NumberFilter(field_name='shop_price', lookup_expr='lte')
top_category = django_filters.NumberFilter(method='top_category_filter', field_name='category_id', lookup_expr='=') # 自定义过滤,过滤某个一级分类
#过滤逻辑
#类别为1OR2OR3
def top_category_filter(self, queryset, name, value):
queryset = queryset.filter(Q(category_id=value) | Q(category__parent_category_id=value) | Q(category__parent_category__parent_category_id=value))
return queryset
class Meta:
model = Goods
fields = ['pricemin', 'pricemax', 'is_hot', 'is_new']