您现在的位置是: 网站首页 >Django >Vue+Django REST framework前后端分离生鲜电商 Django

【Vue+DRF生鲜电商】06.DRF环境配置,使用Serializer类序列化商品列表

admin2019年4月21日 21:47 Django | Python | Vue 1610人已围观

Vue+Django REST framework前后端分离生鲜电商简介 Vue+Django REST framework 打造前后端分离的生鲜电商项目(慕课网视频)。 Github地址:https://github.com/xyliurui/DjangoOnlineFreshSupermarket ; Django版本:2.2、djangorestframework:3.9.2。 前端Vue模板可以直接联系我拿。

## DRF环境配置 ### 依赖包安装 访问 https://www.django-rest-framework.org/ The following packages are optional: - [coreapi](https://pypi.org/project/coreapi/) (1.32.0+) - 模式生成的支持。 - [Markdown](https://pypi.org/project/Markdown/) (2.1.0+) - 对可浏览API的标记支持。 - [django-filter](https://pypi.org/project/django-filter/) (1.0.1+) - 过滤的支持。 - [django-crispy-forms](https://github.com/maraujop/django-crispy-forms) - 改进的HTML显示过滤。 - [django-guardian](https://github.com/django-guardian/django-guardian) (1.1.1+) - 对象级权限支持。 进行依赖包安装 ```bat pip install coreapi Markdown django-filter django-crispy-forms django-guardian -i https://pypi.douban.com/simple/ ``` ### DRF文档API功能 `coreapi`库是API文档的依赖项。确保安装最新版本。`pygments`和`markdown`库是可选的,但推荐使用。 修改项目的主 urls.py ```python from rest_framework.documentation import include_docs_urls from goods.views_base import GoodsListView urlpatterns = [ path('admin/', admin.site.urls), path('api-auth/', include('rest_framework.urls')), # drf 认证url path('ckeditor/', include('ckeditor_uploader.urls')), # 配置富文本编辑器url path('goods/', GoodsListView.as_view(), name='goods_list'), # DRF文档 path('docs/', include_docs_urls(title='DRF文档')), ] ``` ## 开始进入DRF编写 ### Serializer显示商品列表 #### GoodsListView(APIView) 参考 https://www.django-rest-framework.org/tutorial/3-class-based-views/ 示例进行 将视图重写为一个基于类`APIView`的视图。 修改 goods/views.py ```python from rest_framework.views import APIView from rest_framework.response import Response from .models import Goods from .serializers import GoodsSerializer class GoodsListView(APIView): """ 显示所有的商品列表 """ def get(self, request, format=None): all_goods = Goods.objects.all() serializer = GoodsSerializer(all_goods, many=True) # 需要在应用下创建serializers.py文件写序列化类 return Response(serializer.data) ``` 这个看起来较好了,它还是很像基于函数的视图。 #### GoodsSerializer(serializers.Serializer) 如何编写 `GoodsSerializer`,参考 https://www.django-rest-framework.org/tutorial/1-serialization/#creating-a-serializer-class 创建 goods/serializers.py ,增加 `GoodsSerializer`,类似于Django的Form ```python from rest_framework import serializers class GoodsSerializer(serializers.Serializer): name = serializers.CharField(max_length=300, required=True) shop_price = serializers.FloatField(default=0) ``` #### URL配置 修改主 urls.py `goods` 的url ```python from goods.views import GoodsListView urlpatterns = [ path('admin/', admin.site.urls), path('api-auth/', include('rest_framework.urls')), # drf 认证url path('ckeditor/', include('ckeditor_uploader.urls')), # 配置富文本编辑器url path('goods/', GoodsListView.as_view(), name='goods_list'), # DRF文档 path('docs/', include_docs_urls(title='DRF文档')), ] ``` 现在访问 http://127.0.0.1:8000/goods/ 就是drf格式的商品列表了 ![BLOG_20190421_215156_57](/media/blog/images/2019/04/BLOG_20190421_215156_57.png "博客图集BLOG_20190421_215156_57.png") 增加`ImageField`图片类型的字段,只需要修改 serializers.py 文件 ```python class GoodsSerializer(serializers.Serializer): name = serializers.CharField(max_length=300, required=True) shop_price = serializers.FloatField(default=0) goods_front_image = serializers.ImageField() ``` ![BLOG_20190421_215134_62](/media/blog/images/2019/04/BLOG_20190421_215134_62.png "博客图集BLOG_20190421_215134_62.png") 这样上方的图片字段就会显示完整的路径,而Django的`serializer`是没有的。 访问 http://127.0.0.1:8000/goods/?format=json 可以看到json内容 ![BLOG_20190421_215122_32](/media/blog/images/2019/04/BLOG_20190421_215122_32.png "博客图集BLOG_20190421_215122_32.png") #### Serializer保存 参考 https://www.django-rest-framework.org/tutorial/1-serialization/#creating-a-serializer-class 增加`create`函数,`create()`方法定义了在调用`serializer.save()`时如何创建实例。 ```python from rest_framework import serializers from .models import Goods class GoodsSerializer(serializers.Serializer): name = serializers.CharField(max_length=300, required=True) shop_price = serializers.FloatField(default=0) goods_front_image = serializers.ImageField() def create(self, validated_data): """ 给定经过验证的数据,创建并返回一个新的“Goods”实例。 """ return Goods.objects.create(**validated_data) ``` 列化器类与Django表单类非常相似,并且在各个字段上包含类似的验证标志,比如`required`、`max_length`和`default`。 在`GoodsListView`中也需要创建一个`post`函数,用于保存前端传过来的数据,参考 https://www.django-rest-framework.org/tutorial/3-class-based-views/ ```python from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import Goods from .serializers import GoodsSerializer class GoodsListView(APIView): """ 显示所有的商品列表,创建新的商品 """ def get(self, request, format=None): all_goods = Goods.objects.all() serializer = GoodsSerializer(all_goods, many=True) # 需要在应用下创建serializers.py文件写序列化类 return Response(serializer.data) def post(self, request, format=None): serializer = GoodsSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) ``` 添加完成后,会出现POST表单 ![BLOG_20190421_215106_48](/media/blog/images/2019/04/BLOG_20190421_215106_48.png "博客图集BLOG_20190421_215106_48.png") ### ModelSerializer显示商品列表 按照上面的写法,如果模型中有很多字段,那么都需要将其写出来,还是比较麻烦的。 与Django同时提供表单类和ModelForm类一样,REST框架也包含序列化器类和ModelSerializer类。 #### GoodsSerializer(serializers.ModelSerializer) 访问 https://www.django-rest-framework.org/tutorial/1-serialization/#using-modelserializers 查看示例,和`ModelForm`写法类似 修改`GoodsSerializer` ```python from rest_framework import serializers from .models import Goods class GoodsSerializer(serializers.ModelSerializer): class Meta: model = Goods fields = ('id', 'name', 'category', 'shop_price', 'goods_front_image') ``` 刷新页面 ![BLOG_20190421_215049_78](/media/blog/images/2019/04/BLOG_20190421_215049_78.png "博客图集BLOG_20190421_215049_78.png") 显示所有字段,修改`GoodsSerializer`,使用`'__all__'`来表示所有字段 ```python from rest_framework import serializers from .models import Goods class GoodsSerializer(serializers.ModelSerializer): class Meta: model = Goods fields = '__all__' ``` ![BLOG_20190421_215031_58](/media/blog/images/2019/04/BLOG_20190421_215031_58.png "博客图集BLOG_20190421_215031_58.png") #### 获取分类外键完整信息 在这,商品分类`category`显示的是`id`,如果将外键的完整信息获取出来,只需要在创建一个外键的Serializer,然后实例化它 ```python from rest_framework import serializers from .models import Goods, GoodsCategory class CategorySerializer(serializers.ModelSerializer): class Meta: model = GoodsCategory fields = '__all__' class GoodsSerializer(serializers.ModelSerializer): category = CategorySerializer() # 自定义字段覆盖原有的字段,实例化 class Meta: model = Goods fields = '__all__' ``` ![BLOG_20190421_215017_23](/media/blog/images/2019/04/BLOG_20190421_215017_23.png "博客图集BLOG_20190421_215017_23.png") ### mixins简化GoodsListView代码 查看 https://www.django-rest-framework.org/tutorial/3-class-based-views/#using-mixins 示例 使用基于类的视图的一大好处是,它允许轻松地组合可重用的行为。 ```python from rest_framework import mixins from rest_framework import generics from .models import Goods from .serializers import GoodsSerializer class GoodsListView(mixins.ListModelMixin, generics.GenericAPIView): """ 显示所有的商品列表 """ queryset = Goods.objects.all()[:5] # 可以取一定的数量 serializer_class = GoodsSerializer def get(self, request, *args, **kwargs): # 上方继承的类中没有get方法,所以必须要定义,对应url中的GET,否则访问的时候就会提示:方法 “GET” 不被允许。 return self.list(request, *args, **kwargs) ``` 基类提供核心功能,mixin类提供`.list()`和`.create()`操作。然后显式地将`get`和`post`方法绑定到适当的操作。到目前为止已经足够简单了。 使用mixin类,重写了视图,比以前使用的代码稍微少一些,但是可以更进一步。REST框架提供了一组已经混合在一起的通用视图,可以使用这些视图来进一步简化`GoodsListView`模块。 ```python from rest_framework import mixins from rest_framework import generics from .models import Goods from .serializers import GoodsSerializer class GoodsListView(generics.ListAPIView): """ 显示所有的商品列表 """ queryset = Goods.objects.all()[:5] # 可以取一定的数量 serializer_class = GoodsSerializer ``` 因为`generics.ListAPIView`已经继承了`mixins.ListModelMixin,GenericAPIView`,并已经提供了`get()`方法。可以按住ctrl点击`generics`查看源码结构。 ![BLOG_20190421_214942_18](/media/blog/images/2019/04/BLOG_20190421_214942_18.png "博客图集BLOG_20190421_214942_18.png") 同样商品也是正常显示出来的

很赞哦! (0)

文章交流

  • emoji
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行1163天
  • 系统信息:Linux
  • 后台程序:Python: 3.8.10
  • 网站框架:Django: 3.2.6
  • 文章统计:256 篇
  • 文章评论:54 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 公众号:微信扫描二维码,关注我们
  • QQ群:QQ加群,下载网站的学习源码
返回
顶部
标题 换行 登录
网站