chapter 5、Django restframework

目录

 

5.1分发路由

5.2序列化数据(将数据库文件取出转换为json问价并传递到前端网页)

5.3serializer的使用

5.4serializer配置

5.6 优化views.py并进行分页

5.7 viewset

5.8 RESTframework 的继承关系

5.9 Django request和response类

5.10过滤,懒得写爬源码吧


RESTframework方法详解:https://www.jianshu.com/p/f3606a5def69

RESTframework官方文档:http://www.django-rest-framework.org/

 

5.1分发路由

mxshop.urls.py

urlpatterns = [
    path('goods/',include('goods.urls'),name = 'goods'),
    # path('goods/',GoodsListView.as_view(),name = 'goods_list'),
]

goods.urls.py

from django.urls import path,re_path

from .views_base import GoodsListView

urlpatterns = [
    path('list/',GoodsListView.as_view(),name = 'list')
]

5.2序列化数据(将数据库文件取出转换为json问价并传递到前端网页)

1、在浏览器中安装jsonview插件

2、goods.views_base.py

import json



from django.views.generic.base import View
from django.http import HttpResponse,JsonResponse
from django.forms.models import model_to_dict
from django.core import serializers


from goods.models import Goods


class GoodsListView(View):
    '''
    商品列表页
    '''
    def get(self,request):
        goods = Goods.objects.all()[:10]
        # json_list = []
        # for good in goods:
        #     json_dict = {}
        #     json_dict['name'] = good.name
        #     json_dict['category'] = good.category.name
        #     json_dict['market_price'] = good.market_price
        #     json_list.append(json_dict)
        # for good in goods:
        #     json_dict = model_to_dict(good)
        #     json_list.append(json_dict)
        # return HttpResponse(json.dumps(json_list),content_type='application/json')
        json_data = serializers.serialize('json',goods)#将数据库中取出的内容转换为json
        json_data = json.loads(json_data)#将json数据转换为字符数据
        return JsonResponse(json_data,safe=False)




前端显示效果:

5.3serializer的使用

serializer官方文档

5.4serializer配置

1、在goods app 下面新建serializer.py文件 这个文件和models.py文件功能相类似,是建立在models.py文件基础之上的文件

serializer.py

from rest_framework import serializers


class GoodsSerialize(serializers.Serializer):
    name = serializers.CharField(required=True,max_length=50)
    click_num = serializers.IntegerField(default=0)

2、配置goods.views.py

from .serializer import GoodsSerialize
from rest_framework.views import APIView
from rest_framework.response import Response


from .models import Goods


class GoodsListView(APIView):
    """
    List all snippets, or create a new snippet.
    """
    def get(self, request, format=None):
        goods = Goods.objects.all()[:10]
        goods_serializer = GoodsSerialize(goods, many=True)#mang = True 结果会序列化为一个数组对象
        return Response(goods_serializer.data)

3、将之前配置的views_base.py中的GoodsListView路由删除,重新配置views.py中的路由

 

 

5.5 完善serializer.py

from rest_framework import serializers
from .models import Goods,GoodsCategory

class GoodsCategorySerialize(serializers.ModelSerializer):
    class Meta:
        model = GoodsCategory
        fields = "__all__"#和forms.py 的功能一样,但是serializer可以不指明字段,直接写all,即使用全部字段


class GoodsSerialize(serializers.ModelSerializer):#serializers.ModelSerializer不再继承serializers.Serializer了
    category = GoodsCategorySerialize()#category 为goods的外键这里直接继承外键的内容,就可以将外键的内容全部显示
    class Meta:
        model = Goods
        fields = "__all__"


# class GoodsSerialize(serializers.Serializer):
#     name = serializers.CharField(max_length=50,default='')
#     click_num = serializers.IntegerField(default=0)

5.6 优化views.py并进行分页

 1、Django restframework serializer 重写编写goods.views.py

# from .serializer import GoodsSerialize
# from rest_framework.views import APIView
# from rest_framework.response import Response
# from .models import Goods
# class GoodsListView(APIView):
#     """
#     List all snippets, or create a new snippet.
#     """
#     def get(self, request, format=None):
#         goods = Goods.objects.all()[:10]
#         goods_serializer = GoodsSerialize(goods, many=True)#mang = True 结果会序列化为一个数组对象
#         return Response(goods_serializer.data)

    # def post(self, request, format=None):
    #     serializer = GoodsSerialize(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)

from rest_framework import mixins
from rest_framework import generics

from .models import Goods
from .serializer import GoodsSerialize


class GoodsListView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    '''
    queryset和serializer_class的名字不可以改变,因为所继承的generics.GenericAPIView源码里面的参数就是这个名字
    '''
    queryset = Goods.objects.all()
    serializer_class = GoodsSerialize

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

通过继承的方式简化views.py的编写

2、sittings.py设置前端分页

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

5.7 viewset

1、修改views.py 使用继承viewset的方式

修改前代码:

from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets

from .models import Goods
from .serializer import GoodsSerialize


class GoodsListView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    '''
    queryset和serializer_class的名字不可以改变,因为所继承的generics.GenericAPIView源码里面的参数就是这个名字
    '''
    queryset = Goods.objects.all()
    serializer_class = GoodsSerialize

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

修改后代码:

from rest_framework import mixins
from rest_framework import viewsets

from .models import Goods
from .serializer import GoodsSerialize


class GoodsListViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):
    queryset = Goods.objects.all()
    serializer_class = GoodsSerialize

2、在goods.urls.py中注册url

A:不使用router方式的注册:

from django.urls import path,re_path

# from .views_base import GoodsListView
from .views import GoodsListViewSet

list = GoodsListViewSet.as_view(
    {
        'get':'list',
    }
)

urlpatterns = [
    path('list/',list,name = 'list')
]

B、使用router方式注册:

from django.urls import path,re_path,include
from rest_framework.routers import DefaultRouter

from .views import GoodsListViewSet


router = DefaultRouter()
router.register(r'list',GoodsListViewSet,base_name='list')

urlpatterns = [
    path('',include(router.urls))
]

5.8 RESTframework 的继承关系

5.9 Django request和response类

5.10过滤,懒得写爬源码吧

 

 

 

 

猜你喜欢

转载自blog.csdn.net/bobbykey/article/details/81220943
今日推荐