Django+Vue生鲜电商

【Vue+DRF生鲜电商】06.DRF环境配置,使用Serial

2019-04-21  本文已影响22人  吾星喵

欢迎访问我的博客专题

源码可访问 Github 查看

DRF环境配置

依赖包安装

访问 https://www.django-rest-framework.org/

The following packages are optional:

进行依赖包安装

pip install coreapi Markdown django-filter django-crispy-forms django-guardian -i https://pypi.douban.com/simple/

DRF文档API功能

coreapi库是API文档的依赖项。确保安装最新版本。pygmentsmarkdown库是可选的,但推荐使用。

修改项目的主 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格式的商品列表了

image.png

增加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()
image.png

这样上方的图片字段就会显示完整的路径,而Django的serializer是没有的。

访问 http://127.0.0.1:8000/goods/?format=json 可以看到json内容

image.png

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表单类非常相似,并且在各个字段上包含类似的验证标志,比如requiredmax_lengthdefault

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表单

image.png

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')

刷新页面

image.png

显示所有字段,修改GoodsSerializer,使用'__all__'来表示所有字段

from rest_framework import serializers
from .models import Goods


class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Goods
        fields = '__all__'
image.png

获取分类外键完整信息

在这,商品分类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__'
image.png

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()操作。然后显式地将getpost方法绑定到适当的操作。到目前为止已经足够简单了。

使用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查看源码结构。

image.png

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

上一篇 下一篇

猜你喜欢

热点阅读