【Vue+DRF生鲜电商】06.DRF环境配置,使用Serial
欢迎访问我的博客专题
源码可访问 Github 查看
DRF环境配置
依赖包安装
访问 https://www.django-rest-framework.org/
The following packages are optional:
- coreapi (1.32.0+) - 模式生成的支持。
- Markdown (2.1.0+) - 对可浏览API的标记支持。
- django-filter (1.0.1+) - 过滤的支持。
- django-crispy-forms - 改进的HTML显示过滤。
- django-guardian (1.1.1+) - 对象级权限支持。
进行依赖包安装
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
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
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
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
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格式的商品列表了

增加ImageField
图片类型的字段,只需要修改 serializers.py 文件
class GoodsSerializer(serializers.Serializer):
name = serializers.CharField(max_length=300, required=True)
shop_price = serializers.FloatField(default=0)
goods_front_image = serializers.ImageField()

这样上方的图片字段就会显示完整的路径,而Django的serializer
是没有的。
访问 http://127.0.0.1:8000/goods/?format=json 可以看到json内容

Serializer保存
参考 https://www.django-rest-framework.org/tutorial/1-serialization/#creating-a-serializer-class 增加create
函数,create()
方法定义了在调用serializer.save()
时如何创建实例。
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/
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表单

ModelSerializer显示商品列表
按照上面的写法,如果模型中有很多字段,那么都需要将其写出来,还是比较麻烦的。
与Django同时提供表单类和ModelForm类一样,REST框架也包含序列化器类和ModelSerializer类。
GoodsSerializer(serializers.ModelSerializer)
访问 https://www.django-rest-framework.org/tutorial/1-serialization/#using-modelserializers 查看示例,和ModelForm
写法类似
修改GoodsSerializer
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')
刷新页面

显示所有字段,修改GoodsSerializer
,使用'__all__'
来表示所有字段
from rest_framework import serializers
from .models import Goods
class GoodsSerializer(serializers.ModelSerializer):
class Meta:
model = Goods
fields = '__all__'

获取分类外键完整信息
在这,商品分类category
显示的是id
,如果将外键的完整信息获取出来,只需要在创建一个外键的Serializer,然后实例化它
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__'

mixins简化GoodsListView代码
查看 https://www.django-rest-framework.org/tutorial/3-class-based-views/#using-mixins 示例
使用基于类的视图的一大好处是,它允许轻松地组合可重用的行为。
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
模块。
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
查看源码结构。

同样商品也是正常显示出来的