目录
5.2序列化数据(将数据库文件取出转换为json问价并传递到前端网页)
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的使用
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过滤,懒得写爬源码吧