1.环境安装与配置
DRF需要以下依赖:
-
Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
-
Django (1.10, 1.11, 2.0)
pip list -- 查看 Django 版本
DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境无需从新创建。(若没有Django环境,需要先创建环境安装Django)
2.安装DRF
python 项目终端
pip install djangorestframework
3. settings.py 配置
# 添加
'rest_framework'
到您的INSTALLED_APPS
设置中。INSTALLED_APPS = [
... 'rest_framework',
]
4.什么是 ModelSerializer:
序列化:一般是在数据库或者其他地方将数据读出来经过处理转成json结构返回给前端供其使用。
ModelSerializer 是对 serializers 的进一步封装;
5.eg:案例
`url.py`
from rest_framework import routers
from myApp.views import *
urlpatterns = []
router = routers.SimpleRouter(trailing_slash=False)
# 类别
router.register("category", CategoryView, basename="routers")
# 小类
router.register("subclass", SubclassView, basename="subclass")
urlpatterns += router.urls
print(urlpatterns)
`models.py`
from django.db import models
# Create your models here.
# 类别
class CategoryModel(models.Model):
title = models.CharField('标题', max_length=255)
class Meta:
db_table = 'category'
ordering = ['id']
# 小类
class SubclassModel(models.Model):
title = models.CharField('标题', max_length=255)
content = models.CharField('内容', max_length=255)
# 类别外键 related_name='category_ref'
category = models.ForeignKey(
to=CategoryModel,
on_delete=models.CASCADE
)
region = models.CharField('地区', max_length=255)
class Meta:
db_table = "subclass"
`serializers.py`
首先,我们需要了解正向查询和反向查询的概念
正向查询:使用有外键模型对象去查询没有外键的关联对象 模型对象.外键属性
反向查询:使用没有外键的模型对象去查询有外键的关联对象 模型对象.关联的模型类名_set
from rest_framework import serializers
from myApp.models import *
# 种类嵌套序列化器子类
class CategorySerializerChild(serializers.ModelSerializer):
class Meta:
model = CategoryModel # model 序列化的 模型
"""
fields 序列化的字段(要显示的字段)
fields = ('name',) 只显示该字段,注意 是个元组;
fields = ['name'] 和 上面元组 意思一样
"""
fields = "__all__"
# 小类嵌套序列化器
class SubclassSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
# 添加数据的时候使用; _id 是默认生成的小名, 在数据中可以查看。
category_id = serializers.IntegerField(write_only=True)
"""
1. StringRelatedField
在 models 中与 __str__ 魔法方法配合使用获取 类别的 title 类别标题
category = serializers.StringRelatedField(read_only=True)
2.PrimaryKeyRelatedField
获取 主表 id 数据
category = serializers.PrimaryKeyRelatedField(read_only=True)
3. 嵌套序列化器 从表获取主表关联的数据集合 (正向查询)
category = CategorySerializerChild(read_only=True)
"""
category = CategorySerializerChild(read_only=True)
class Meta:
model = SubclassModel
fields = "__all__"
# 小类 嵌套序列化器子类
class SubclassSerializerChild(serializers.ModelSerializer):
class Meta:
model = SubclassModel
fields = "__all__"
# 类别嵌套序列化器
class CategorySerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
"""
todo: 另外一种实现方式
在外键(ForeignKey)的定义中,我们可以通过设置related_name参数,
来覆盖名字subclassmodel_set (相当于别名的作用) 以起到相同的作用。
1. model外键字段配合序列化器返回数据
category = models.ForeignKey(
to=CategoryModel,
on_delete=models.CASCADE
related_name='category_ref'
)
2. 序列化器:
category_ref = SubclassSerializer(read_only=True, many=True)
"""
# 嵌套序列化器 反向查询
subclassmodel_set = SubclassSerializerChild(read_only=True, many=True)
class Meta:
model = CategoryModel
fields = "__all__"
`views.py`
from django.shortcuts import render
from rest_framework import filters
from rest_framework.viewsets import ModelViewSet
from myApp.models import *
from myApp.serializers import *
# 分页
from rest_framework.pagination import PageNumberPagination
class MyPagination(PageNumberPagination):
page_size = 5
page_query_param = 'page'
page_size_query_param = 'page_size'
max_page_size = 10
def get_paginated_response(self, data):
return Response(OrderedDict([
('count', self.page.paginator.count),
('results', data)
]))
# 类别
class CategoryView(ModelViewSet):
queryset = CategoryModel.objects.all()
pagination_class = MyPagination
serializer_class = CategorySerializer
# 模糊查询
filter_backends = [filters.SearchFilter]
search_fields = ['id']
# 小类
class SubclassView(ModelViewSet):
queryset = SubclassModel.objects.all()
serializer_class = SubclassSerializer