设计RESTful风格的文档接口

1. 安装第三方库 djangorestframework

pip install djangorestframework

2. 注册rest_framework

# settings.py
INSTALLED_APPS = [
    'rest_framework'
]

3. 序列化模型

# serializers.py
from rest_framework import serializers
from car.models import Record

class RecordSerializer(serializers.ModelSerializer):

    class Meta:
        model = Record
        fields = '__all__'

4. 视图集

# views.py
from car.serializers import RecordSerializer

class SearchViewSet(ModelViewSet):
    queryset = Record.objects.all().order_by('-makedate')
    serialize_class = RecordSerializer
    
# urls.py
router = DefaultRouter()
router.register('records', SearchViewsSet)
urlpatterns += router.urls

5. CBV (Class-Based View) 代码量少,简单方便

# views.py
class SearchView(ListCreateAPIView, DestoryAPIView):
    queryset = Record.objects.all().order_by('-makedate')
    serialize_class = RecordSerializer
# urls.py
urlpatterns = [
  path('records', SearchView.as_view())
]

6. FBV (Function-Based View) 灵活,完全自己定制,但代码较多

# views.py
@api_view(['GET', 'POST'])
def search(request):
    if request.method == 'POST':
        record = Record()
        record.save()
        serializer = RecordSerializer(record)
    else:
        queryset = Record.objects.all()
        serializer = RecordSerializer(queryset, many=True)
    return Response(serializer.data)

7. 实现分页功能

# 设置默认分页
# settings.py

REST_FRAMEWORK = {
    # 每页显示5个结果 
    'PAGE_SIZE':5,
    'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination'
}
# 自定义分页
# views.py
class CustomPagination(PageNumberPagination):
    page_size = 5
    page_size_query_param = 'size'
    max_page_size = 50

class SearchViewSet(ModelViewSet):
    queryset = Record.objects.all().order_by('-makedate')
    serializer_class = RecordSerializer
    pagination_class = CustomPagination
    

8. 数据过滤

8.1 自定义过滤器

class RecordFilter(FilterSet):
    carno_or_owner = django_filters.CharFilter(method='search', label='输入车牌号或车主姓名')
    @staticmethod
    def search(queryset, name, value):
        return queryset.filter(Q(carno=normalize_carno(value)) |
                               Q(owner__icontains=value))

8.2 在视图集中加上过滤器

class SearchViewSet(ModelViewSet):
    # 获取所有对象
    # 数据序列化
    # 添加分页规则
    # 添加过滤器
    filter_backends = (DjangoFilterBackend, OrderingFilter)
    filter_class = RecordFilter
    # 可选过滤选择
    # filterset_fields = ('carno', 'owner', )
    # 默认排序方式
    ordering = ('-makedate', )
    # 可选排序方式
    ordering_fields = ('carno', 'makedate', )
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,138评论 1 32
  • 1, 序列化 Serialization 创建一个新环境 在做其他事之前,我们会用virtualenv创建一个新的...
    光着脚的鞋阅读 707评论 0 1
  • 注意:这是版本3的文档。还提供了版本2的文档。 Django REST framework 是一个强大且灵活的工具...
    鹏ve阅读 4,559评论 0 6
  • 今天大年初二,我和妈妈去我姥姥家走亲戚去的,一路上这天阴沉沉的,看起来似乎要下雪,我们今天走的早,所以在高速路...
    冰凉的琉璃阅读 515评论 2 4
  • 曾经以为爱上你是最幸福的事 后来发现那是可望不可及的事 后来呀 我们还是在一起了 然而我有一种患得患失的感觉 害怕...
    小小丰兄阅读 162评论 4 1