Vue+Django2.0 restframework打造前后端分離的生鮮電商項目(3)


1.drf前期准備

1.django-rest-framework官方文檔

https://www.django-rest-framework.org/
#直接百度找到的djangorestframework的官網是打不開的

2.安裝依賴包

如圖所示,django restframework的依賴模塊,除了coreapi和django-guardian,已經在前面安裝過了。

打開終端,執行安裝命令

pip install django-guardian
pip install coreapi

3.將rest_framework在settings中注冊

4.管理調試api的時候會用到的url配置,在urls.py中

from django.urls import path

from django.views.static import serve
from MxShop.settings import MEDIA_ROOT
from django.urls import include

import xadmin

from rest_framework.documentation import include_docs_urls

from goods.views import GoodsListView

urlpatterns = [
    path('xadmin/', xadmin.site.urls),
    path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}),
    path('ueditor/',include('DjangoUeditor.urls' )),
    path('docs/',include_docs_urls(title="慕學生鮮")),
    path('api-auth/', include('rest_framework.urls')),
    path('goods/',GoodsListView.as_view(),name='goods-list'),
]

2.序列化商品數據

在goods目錄下新建serializers.py文件

from rest_framework import serializers
from goods.models import Goods,GoodsCategory


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

    # 用於post
    def create(self, validated_data):
        return Goods.objects.create(**validated_data)


class CategoryModelSerializer(serializers.ModelSerializer):
    class Meta:
        model=GoodsCategory
        fields="__all__"#將整個表的所有字段都序列化


class GoodsModelSerializer(serializers.ModelSerializer):#ModelSerializer方式序列化
    category=CategoryModelSerializer()#外鍵信息嵌入
    class Meta:
        model=Goods
        # fields="__all__"#將整個表的所有字段都序列化
        fields=('name','goods_front_image','category')#指定序列化某些字段

 

 3.視圖封裝

1.使用APIView+Response實現商品列表頁視圖(最想原生django的CBV寫法)

views.py中

from .serializers import GoodsSerializer,GoodsModelSerializer
from rest_framework.views import APIView
from rest_framework.response import Response

from .models import Goods
from rest_framework import status


class GoodsListView1(APIView):
    """
    List all goods,使用Serializer
    """
    def get(self, request, format=None):
        goods=Goods.objects.all()[:10]
        goods_serializer = GoodsSerializer(goods, many=True)
        return Response(goods_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)


class GoodsListView2(APIView):
    """
    List all goods,使用ModelSerializer
    """
    def get(self, request, format=None):
        goods=Goods.objects.all()[:10]
        goods_serializer = GoodsModelSerializer(goods, many=True)
        return Response(goods_serializer.data)

urls.py中

from django.contrib import admin
from django.urls import path

from django.views.static import serve
from MxShop.settings import MEDIA_ROOT

import xadmin
from goods.views import GoodsListView1,GoodsListView2

urlpatterns = [
    path('admin/', admin.site.urls),
    path('xadmin/', xadmin.site.urls),
    path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}),
    path('ueditor/',include('DjangoUeditor.urls' )),

    path('goods/',GoodsListView1.as_view(),name='goods-list'),
    path('goods2/',GoodsListView2.as_view(),name='goods-list2')
]

 

2.使用mixins+generic實現商品列表頁視圖

from .serializers import GoodsSerializer
from .models import Goods
from rest_framework import mixins
from rest_framework import generics

class GoodsListView(mixins.ListModelMixin,generics.GenericAPIView):
    """
    商品列表頁
    """
  queryset = Goods.objects.get_queryset().order_by('id')[:10]
   serializer_class = GoodsSerializer 

  def get(self,request,*args,**kwargs):

    return self.list(request,*args,**kwargs)

3.使用generics.ListAPIView實現商品列表頁視圖

from .serializers import GoodsSerializer
from .models import Goods
from rest_framework import generics

class GoodsListView(generics.ListAPIView):
    """
    商品列表頁
    """
    queryset = Goods.objects.get_queryset().order_by('id')
    serializer_class = GoodsSerializer

 4.分頁

1.全局分頁:在settings中加入代碼,所有的列表頁,都會變成每10個一頁的分頁方式,顯然這有很大的局限性

REST_FRAMEWORK={
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
}

 2.局部定制化分頁:在view中定義代碼

from rest_framework.pagination import 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.get_queryset().order_by('id')
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination

 5.viewsets

1.在views中

from rest_framework import viewsets

class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
    """
    商品列表頁
    """
    queryset = Goods.objects.get_queryset().order_by('id')
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination

2.在urls中

from goods.views import GoodsListViewSet

from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'goods', GoodsListViewSet,base_name="goods") 
urlpatterns
= [ path('', include(router.urls)) ]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM