Django REST Framework 基本介绍
Django REST framework(DRF)框架文档齐全,社区较稳定,而且由于它是基于Django这个十分全面的框架而设计开发的,能够让开发者根据自己的业务需要,使用极少的代码量快速的开发一套符合RESTful风格的API,并且还支持自动生成API文档。 Django rest Framer work 中文文档: https://q1mi.github.io/Django-REST-framework-documentation/api-guide/views_zh/
下载
注意版本
pip install djangorestframework
pip install markdown
pip install django-filter
pip install coreapi
配置
需要在INSTALLED_APPS 中添加:
'rest_framework'
url中配置
from rest_framework.documentation import include_docs_urls
url('^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
serializer的基本使用
创建serializer类:
serializer(序列化):这个就是简单快速的处理返回json数据 首先需要在app下创建一个serializer.py的文件,这个的作用类似django的forms(可以帮助我们做一些简单处理)
from rest_framework import serializers
class GoodsSerializer(serializers.Serializer):
name=serializers.CharField(required=True)
click_name=serializers.IntegerField(default=0)
goods_front_image=serializers.ImageField()
这个类中重复了很多包含在模型类(model)中的字段。下面的ModeSerializers能够帮助我们解决这个问题
在APIView类使用serializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializer import GoodsSerializer
from .models import Goods
class GoodsListApi(APIView):
def get (self,request,format=None):
goods=Goods.objects.all()[:10]
serializer=GoodsSerializer(goods,many=True)
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.error_messages,status=status.HTTP_400_BAD_REQUEST )
从上面的代码可以看出djangorestframwork比django返回json数据代码量还是少的多
使用ModelSerializers
ModelSerializers是对Serializers的代码简洁使用 重新打开serializer.py,重新编写
from rest_framework import serializers
from .models import Goods
class GoodsSerializer(serializers.ModelSerializer):
class Meta:
model = Goods
fields = ('name','goods_front_image','add_time','想要返回model的字段名')
fields ='__all__'
使用DRF返回的json数据和django返回的图片地址也不一样,路径地址会加上media,media是settings中设置的
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
MEDIA_URL = '/media/'
要是我们想返回的json也将外键的相关信息也返回我们可以这样写
from rest_framework import serializers
from .models import Goods,GoodsCategory
class GoodsCategorySerializer(serializers.ModelSerializer):
class Meta:
model = GoodsCategory
fields = '__all__'
class GoodsSerializer(serializers.ModelSerializer):
category=GoodsCategorySerializer()
class Meta:
model = Goods
fields = '__all__'
mixins.ListModelMixin,generics.GenericAPIView的相关使用
使用之前这个之前需要创建serializer类,不会可以去看上面的ModelSerializers
class GoodsListApi(mixins.ListModelMixin,generics.GenericAPIView):
queryset = Goods.objects.all()[:10]
serializer_class=GoodsSerializer
def get(self,request,*args,**kwargs):
return self.list(request,*args,**kwargs)
可以看到也是成功返回数据了
ListAPIView基本使用
从上面的APIView中可以看出返回json数据还是太麻烦了我们有更简单的使用方法,就是使用ListAPIView 实例:
from rest_framework import generics
class GoodsListApi(generics.ListAPIView):
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
可以看到返回的图片地址都加上了域名
mixins.ListModelMixin,viewsets.GenericViewSet的相关使用
这个前面和不同的是urls中配置不一样,这个能更好管理url 实例: view:
from rest_framework import viewsets
from rest_framework import mixins
class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
urls: 第一种写法:
good_list=GoodsListViewSet.as_view({
"get":"list",
})
path('goods/', good_list, name="goods_list")
第二种写法:
from rest_framework.routers import DefaultRouter
router=DefaultRouter()
router.register('goods',GoodsListViewSet)
url('^', include(router.urls), name="goods_list"),
ListModelMixin,viewsets.GenericViewSet过滤器
需要上面的url配置 __gte:大于等于 __gt:大于
__lte 小于等于 __lt小于
from rest_framework import viewsets
from rest_framework import mixins
class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
def get_queryset(self):
query_set=Goods.objects.all()
price_min=self.request.query_params.get("price_min",0)
if price_min:
query_set=query_set.filter(shop_price__gt=int(price_min))
return query_set
Django Rest Framework 分页器的相关使用
使用默认的分页
在settings进行配置
'PAGE_SIZE' : 2,
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
自定义分页样式PageNumberPagination
在相应的app下的view文件中创建一个自定义分页类
from rest_framework.pagination import PageNumberPagination
class GoodsPagination(PageNumberPagination):
page_size = 1
page_size_query_param = 'page_size'
page_query_param = "p"
max_page_size = 10000
然后在要使用的ListAPIView类中去指定就行了
|