1 前5章

序列化

在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']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值