序列化
在goods/views.py文件中
from .serializers import GoodsSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Goods
class GoodsListView(APIView):
"""
List all goods.
"""
def get(self, request, format=None):
goods = Goods.objects.all()[:5]
goods_serializer = GoodsSerializer(goods, many=True)
return Response(goods_serializer.data)
from rest_framework import generics
class GoodsListView(generics.ListAPIView):
# 更加精简的展示商品列表
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
序列化写法1
在goods的app下创建serializers.py文件,然后序列化要的字段,官网序列化例子
from rest_framework import serializers
class GoodsSerializer(serializers.Serializer):
name = serializers.CharField(required=True, max_length=100)
click_num = serializers.IntegerField(default=0)
goods_front_image = serializers.ImageField()
这样访问后
序列化写法2
from goods.models import Goods,GoodsCategory
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = GoodsCategory
fields = "__all__"
class GoodsSerializer(serializers.ModelSerializer):
category = CategorySerializer() # 这样能将Goods的外键GoodsCategory也详细显示出来
class Meta:
model = Goods
# fields = ('name','click_num','market_price','add_time')
fields = "__all__"
返回分页
1. 在settings中添加变量
REST_FRAMEWORK = {
'PAGE_SIZE': 10,
}
2. 注释掉settings中添加的变量,在apps\goods\views.py文件添加
from rest_framework.pagination import PageNumberPagination
class GoodsPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
page_query_param = 'p' # 在返回的时候显示 p=2 p=3
max_page_size = 100
from rest_framework import generics
class GoodsListView(generics.ListAPIView):
# 更加精简的展示商品列表
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
page_query_param = 'p'这样page=?改为p=?。前端可以在url中直接输入p=5这样来跳页
5-7 viewsets和router完成商品列表页
goods/views中
from rest_framework import mixins,viewsets
class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
在主url中配置
# 使用viewset方式
from goods.views import GoodsListViewSet
goods_list = GoodsListViewSet.as_view({
'get':'list',
})
urlpatterns = [
url(r'goods/$',goods_list,name='goods-list'),
]
# 使用router
from goods.views import GoodsListViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'goods',GoodsListViewSet)
urlpatterns = [
url(r'^',include(router.urls)),
]
5-11 drf的搜索和排序
goods/views.py中
from rest_framework import mixins,viewsets
from django_filters.rest_framework import DjangoFilterBackend
from .filters import GoodsFilter
from rest_framework import filters
class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
# 配置filter
filter_backends = (DjangoFilterBackend, filters.SearchFilter,filters.OrderingFilter)
# filter_fields = ('name', 'shop_price') # 这样前段filter的时候只能完全匹配过滤,无法模糊或设定区间匹配
# 建立filter.py文件,对需要字段进行模糊匹配,这种过滤方式需要查看github上django-filter的操作
filter_class = GoodsFilter
# 给过滤器添加搜索框进行模糊搜索
search_fields = ('name', 'goods_brief', 'goods_desc')
# 给字段进行排序
ordering_fields = ('sold_num', 'add_time')
goods/filter.py
# https://github.com/carltongibson/django-filter github地址
import django_filters
from .models import Goods
class GoodsFilter(django_filters.rest_framework.FilterSet):
price_min = django_filters.NumberFilter(name='shop_price',lookup_expr='gte')
price_max = django_filters.NumberFilter(name='shop_price',lookup_expr='lte')
name = django_filters.CharFilter(name='name',lookup_expr='icontains')
class Meta:
model = Goods
fields = ['price_min','price_max','name']