(生鲜项目)08. ModelSerializer 实现商品列表页, 使用Mixin来实现返回, 以及更加方便的ListAPIView, 以及分页的设置

第一步: 学会使用ModelSerializer, 并且会使用ModelSerializer相互嵌套功能

1. goods.serializers.py

from rest_framework import serializers

from goods.models import Goods, GoodsCategory

# 让goods的category字段全量显示
class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = GoodsCategory
        fields = "__all__"  # 取所有字段

# 方式一
# class GoodsSerializer(serializers.Serializer):
#     name = serializers.CharField(required=True, max_length=100)
#     click_num = serializers.IntegerField(default=0)
#     goods_front_image=serializers.ImageField()

# 方式二: 用ModelSerializer
class GoodsSerializer(serializers.ModelSerializer):
    category = CategorySerializer()  # 重写category字段,从而实现ModelSerializer的嵌套

    class Meta:
        model = Goods
        # fields = ("name", "click_num", "market_price", "add_time")
        fields = "__all__"  # 取所有字段

2 . 刷新网页看看结果

第二步: 使用Mixin来实现返回

goods.views.py

from rest_framework import mixins
from rest_framework import generics
from rest_framework.views import APIView
from rest_framework.response import Response

from .models import Goods
from .serializers import GoodsSerializer

# # 方式一, APIview继承了View
# class GoodsListView(APIView):
#     """
#     List all snippets, or create a new snippet.
#     """
#
#     def get(self, request, format=None):
#         goods = Goods.objects.all()[:10]
#         goods_serializer = GoodsSerializer(goods, many=True)  # many:是否是querrySet对象
#         return Response(goods_serializer.data)

# # 方式二: 利用mixins.ListModelMixin, generics.GenericAPIView
# class GoodsListView(mixins.ListModelMixin, generics.GenericAPIView):
#     """
#     商品列表页
#     """
#     queryset = Goods.objects.all()[:10]
#     serializer_class = GoodsSerializer
#
#     def get(self, request, *args, **kwargs):
#         return self.list(request, *args, **kwargs)

# # 方式三,使用更加简便的generics.ListAPIView
# # 原理就是: ListAPIView里面继承了mixins.ListModelMixin, generics.GenericAPIView, 而且还封装了返回
class GoodsListView(generics.ListAPIView):
    """
    商品列表页
    """
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer

第三步: 分页的设置

方法一: 在settings里面设置REST_FRAMEWORK分页参数

settings.py

REST_FRAMEWORK = {
    # 解决 1.11.3版本下使用APIview会报‘CSRFCheck‘ object has no attribute ‘process_request‘的问题
    # "DEFAULT_AUTHENTICATION_CLASSES": [],

    ‘DEFAULT_PAGINATION_CLASS‘: ‘rest_framework.pagination.PageNumberPagination‘,
    ‘PAGE_SIZE‘: 10,
}

接着去刷新网页

还有下面这个img字段的url的拼接, 也是genericAPIView帮我们完成的

方法二: 在goods.view里面重写PageNumberPagination, 从而达到动态分页的目的, 这样前端就想怎么取就怎么取

goods.view.py

from rest_framework import mixins
from rest_framework import generics
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination  # 自定义分页

from .models import Goods
from .serializers import GoodsSerializer

# 自定义分页功能, 并实现动态分页, 继承PageNumberPagination
class GoodsPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = ‘page_size‘  # 指定每一页显示多少条
    page_query_param = "p"  # 指定要第几页
    max_page_size = 100

class GoodsListView(generics.ListAPIView):
    """
    商品列表页
    """
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination  # 需要指定分页的类

刷新网页试试

------ over  ------

原文地址:https://www.cnblogs.com/jiangzongyou/p/12088647.html

时间: 2024-12-08 19:30:50

(生鲜项目)08. ModelSerializer 实现商品列表页, 使用Mixin来实现返回, 以及更加方便的ListAPIView, 以及分页的设置的相关文章

(生鲜项目)07. api view实现商品列表页

第一步: 环境配置 1. DRF官网: https://www.django-rest-framework.org/ 仔细查看自己当前的python版本以及django版本是否支持DRF, 然后就看看哪些支持的模块还没有下载, 由于之前安装过xadmin了, 所以这里正常情况下还有coreapi, pygments, django-guardian没有安装, 在虚拟环境中去安装就行了 注: 如果在安装coreapi的时候报错, 并且提示utf-8 decode错误, 那么就去修改pip的编码格式

ecshop实现商品列表页属性筛选区品牌筛选以LOGO形式展示

很多时候ecshop分类页的品牌都是以名称的形式显示的,下面ECSHOP开发中心的技术和大家说说ecshop 如何实现商品列表页属性筛选区品牌筛选以LOGO形式展示 1.修改 category.php 文件,将(大概220行) 找到 1 $sql = "SELECT b.brand_id, b.brand_name, COUNT(*) AS goods_num ". 替换成 1 $sql = "SELECT b.brand_id,b.brand_logo, b.brand_n

ecshop模板将商品列表页属性筛选区的品牌以LOGO形式显示

ecshop模板将商品列表页属性筛选区的品牌以LOGO形式显示 商品列表页属性筛选区品牌以LOGO形式显示1.修改 category.php 文件将(大概215行) $sql = "SELECT b.brand_id, b.brand_name, COUNT(*) AS goods_num ". 修改为 $sql = "SELECT b.brand_id,b.brand_logo, b.brand_name, COUNT(*) AS goods_num ". 把商品

让ECSHOP商品列表页和商品详细页分类树跟首页一样

如何让商品列表页或商品详情页的分类树都跟首页一样,也是显示全部所有的分类呢?修改方法:1.商品列表页修改方法:打开category.php 文件将$smarty->assign('categories',       get_categories_tree($cat_id));修改为$smarty->assign('categories',       get_categories_tree());2.商品详情页修改方法:将$smarty->assign('categories',   

分布式电商项目(04)--商品列表查询及分页

前言:前面写了后天管理系统工程搭建以及框架的整合测试,今天写一下商品列表的分页查询 1 需求分析 前台使用easyui的分页工具,后台则使用mybatis分页插件pagehelper 如上图所示,打开后台首页,点击查询商品,按下F12,可以看到easyui的分页界面会向controller发送两个数据page:1,rows:30 controller通过service层以及dao层查询到数据之后也需要将数据封装成easyui需要的格式,而easyui需要的数据格式如下 { total:"2&qu

在ECSHOP商品列表页和搜索页面,最后出现空商品的解决办法

有客户购买了我们的ecshop模板后,自己做了大量的修改和改动,后来出现了商品列表页面和搜索页面出现了多一个商品的问题.没有商品数据,但是多显示了一个商品的样式.下面就由我们68ecshop为大家解决一下这个问题吧!解决的方法如下:<!– {if $goods.goods_id} –> <!– {/if} –>代码框起来即可解决.

【vue】饿了么项目-goods商品列表页开发

1.flex 属性是 flex-grow.flex-shrink 和 flex-basis 属性的简写属性. flex-grow 一个数字,规定项目将相对于其他灵活的项目进行扩展的量. flex-shrink 一个数字,规定项目将相对于其他灵活的项目进行收缩的量. flex-basis 项目的长度.合法值:"auto"."inherit" 或一个后跟 "%"."px"."em" 或任何其他长度单位的数字.

商品列表页一次添加多个规格

可能题目的表述不是特别清晰,具体有一下截图看这会比较明显 页面上的功能描述1. 当页面加载完成后,需要根据不同规格的商品刷新出对应规格商品的价格,2.重置默认数量,这个功能在input标签中设置默认的value值即可,或者添加一个js函数,重置对应class集合中的值,这个不多说,比较简单,3.点击添加购物车,需要把例如上图中的不同规格中的商品能全部添加到购物车 解题思路,要求1,这个任务比较简单,由于这种方式,后台里的商品规格选项必须用单选按钮来做,否则页面效果不容易实现具体要实现什么样式自己

5.goods商品列表页开发

goods组件显示的区域是固定的,也没有滚动条,所以是采用绝对布局的,左右分为menu栏和foods栏,左边固定布局,右边自适应布局,采用flex布局. 写CSS样式的时候,尽量用class,少用tag,因为class的查找效率优于tag,尤其是嵌套层级比较多的时候.左边的menu栏有些是一行有些是多行,要做到不管单行还是多行都是垂直是居中,可以用display:table,table布局是实现垂直居中的有效布局.menu-item设置display:table,text设置display:ta