本文共 5961 字,大约阅读时间需要 19 分钟。
目录
RESTframework方法详解:
RESTframework官方文档:
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_pathfrom .views_base import GoodsListViewurlpatterns = [ path('list/',GoodsListView.as_view(),name = 'list')]
1、在浏览器中安装jsonview插件
2、goods.views_base.py
import jsonfrom django.views.generic.base import Viewfrom django.http import HttpResponse,JsonResponsefrom django.forms.models import model_to_dictfrom django.core import serializersfrom goods.models import Goodsclass 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)
前端显示效果:
1、在goods app 下面新建serializer.py文件 这个文件和models.py文件功能相类似,是建立在models.py文件基础之上的文件
serializer.py
from rest_framework import serializersclass GoodsSerialize(serializers.Serializer): name = serializers.CharField(required=True,max_length=50) click_num = serializers.IntegerField(default=0)
2、配置goods.views.py
from .serializer import GoodsSerializefrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom .models import Goodsclass 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 serializersfrom .models import Goods,GoodsCategoryclass 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)
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 mixinsfrom rest_framework import genericsfrom .models import Goodsfrom .serializer import GoodsSerializeclass 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,}
1、修改views.py 使用继承viewset的方式
修改前代码:
from rest_framework import mixinsfrom rest_framework import genericsfrom rest_framework import viewsetsfrom .models import Goodsfrom .serializer import GoodsSerializeclass 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 mixinsfrom rest_framework import viewsetsfrom .models import Goodsfrom .serializer import GoodsSerializeclass 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 GoodsListViewfrom .views import GoodsListViewSetlist = GoodsListViewSet.as_view( { 'get':'list', })urlpatterns = [ path('list/',list,name = 'list')]
B、使用router方式注册:
from django.urls import path,re_path,includefrom rest_framework.routers import DefaultRouterfrom .views import GoodsListViewSetrouter = DefaultRouter()router.register(r'list',GoodsListViewSet,base_name='list')urlpatterns = [ path('',include(router.urls))]