依赖包: coreapi
, django-guardian
- 配置url:
from rest_framework.documentation import include_docs_urls #支持文档生成的url,结尾不能加$ url(r'docs/',include_docs_urls(title="文档")), # 登录用url,调试api会用到 url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
- setting注册app:
rest_framework
DefaultRouter设置url方式:
from rest_framework.routers import DefaultRouter
from goods.views import GoodsListAPIView
router = DefaultRouter()
router.register(r'goods', GoodsListAPIView) #参数:1.url的访问字段,2.viwes中的方法名
dsf返回json数据的方式:
-
在应用中新建serializers.py来重写serializers方法:
from rest_framework import serializers
from .models import Goods,GoodsCategory
#方法1.基本序列化器,字段需要自己写
name = serializers.CharField(max_length=50) ```
#方法2:全部的序列化器,会自动调出所有字段
#(外键表)
class GoodsCategorySerializer(serializers.ModelSerializer):
class Meta:
#Model
model = GoodsCategory
#把所有的属性都用上的写法
fields = "__all__"
#(主表)
class Goodserializer(serializers.ModelSerializer):
#关联外键
category = GoodsCategorySerializer()
class Meta:
model = Goods
fields = '__all__'
- 在views.py视图中调用序列serializers
class GoodsListAPIView(generics.ListAPIView): queryset = Goods.objects.all() serializer_class = Goodserializer ```
- seeting中配置每页显示的数量
REST_FRAMEWORK = {
#rest_framework目录下的pagination.py文件PageNumberPagination类
'DEFAULT_PAGINATION_CLASS': "rest_framework.pagination.PageNumberPagination",
# #每页显示10条数据
'PAGE_SIZE': 2,
}
- 配置动态显示数据,动态设置每页数量:
views.py:
class GoodsListPagination(PageNumberPagination):
#默认返回10条
page_size = 10
#每页返回多少条的参数变量
page_size_query_param = 'page_size'
page_query_param = "p"#页码的定义
#最大返回100条
# max_page_size = 100
class GoodsListAPIView(generics.ListAPIView):
queryset = Goods.objects.all()
serializer_class = Goodserializer
# 添加分页配置,settings.py就可以省略了
pagination_class = GoodsListPagination
#url访问格式:http://127.0.0.1:8000/goods/?p=3&page=2
viwes中viewsets方法及过滤,模糊查找,查询,排序.
#新建filters.py重写filters方法
from django_filters import rest_framework as filters
from .models import Goods
#商品的过滤器
class GoodsFilter(filters.FilterSet):
#最低价格
min_price = filters.NumberFilter(name="shop_price", lookup_expr='gte')
#最大价格
max_price = filters.NumberFilter(name="shop_price", lookup_expr='lte')
#模糊查询
name = filters.CharFilter(name='name',lookup_expr='icontains')
class Meta:
model = Goods
fields = [ 'min_price', 'max_price','name']
#views.py (上述views中方法的替代)
class GoodsListAPIViewSet(viewsets.GenericViewSet,mixins.ListModelMixin):
queryset = Goods.objects.all()
serializer_class = Goodserializer
# 添加分页配置,settings.py就可以省略了
pagination_class = GoodsListPagination
#过滤器
filter_backends = (DjangoFilterBackend,filters.OrderingFilter,filters.SearchFilter)
filter_class = GoodsFilter
ordering_fields = ('shop_price','add_time')
# '^name'必须以name开头才会满足搜索条件,'=name'为精确搜索
search_fields = ('name', 'goods_brief','goods_desc')