Django-REST-framework(DRF)框架的使用、序列化器
创建django项目
配置settings.py文件
解决跨域
下载django-cors-headers
pip install django-cors-headers
在settings文件中配置
配置数据库
配置__init__.py文件
下载mysql
pip install mysql
配置__init__.py文件
import pymysql
pymysql.install_as_MySQLdb()
在models.py文件中创建表、迁移数据
创建表
from django.db import models
# Create your models here.
# 角色表
class Roles(models.Model):
rname=models.CharField(max_length=20)
def __str__(self):
return self.rname
# 用户表
class Users(models.Model):
uname=models.CharField(max_length=10)
role=models.ForeignKey('Roles',on_delete=models.CASCADE)#外键
# 自关联
class Menu(models.Model):
authName=models.CharField(max_length=10)
path=models.CharField(max_length=50)
parent=models.ForeignKey('self',on_delete=models.CASCADE,null=True,related_name='children')
class Meta:
db_table='menu'
迁移数据库
第一种方式:
- 运行manage.pyn任务
- 记录迁移
- 执行迁移
第二种方式:
在终端执行
- python manage.py makemigrations (记录迁移)
- python manage.py migrate (执行迁移)
在api中创建序列化器Serializers.py 文件
在Serializers.py 文件中创建序列化器
外联序列化器
#引入集合(表)
from api.models import *
# 创建角色序列化器
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Roles
fields = '__all__'
# 创建用户序列化器
# 如果查询表用UserSerializer序列化器
class UserSerializer(serializers.ModelSerializer):
# 外键
role=RoleSerializer()
class Meta:
model = Users
fields = '__all__'
# 如果操作表用UsersSerializer序列化器
class UsersSerializer(serializers.ModelSerializer):
class Meta:
model = Users
fields = '__all__'
搜索序列化器
# 搜索
class UsersFilter(django_filters.FilterSet):
# 根据这个字段搜索
# icontains模糊搜索
uname = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Users
fields = ['uname']
分页序列化器
# 分页
class CustomPagination(PageNumberPagination):
page_size =3
page_query_param = 'pagenum'
page_size_query_param = 'pagesize'
max_page_size = 5
def get_paginated_response(self, data):
return Response(OrderedDict([
('count', self.page.paginator.count),
('data', data)
]))
自关联序列化器
# 自关联
class MenuSerializer(serializers.ModelSerializer):
def get_fields(self):
fields=super(MenuSerializer,self).get_fields()
fields['children']=MenuSerializer(many=True)
return fields
class Meta:
model = Menu
fields = '__all__'
在views.py文件中写接口
操作接口
# 角色接口
class RoleView(ModelViewSet):
queryset = Roles.objects.all()
serializer_class = RoleSerializer
# 用户接口
class UserViewsSet(ModelViewSet):
queryset = Users.objects.all()
serializer_class = UserSerializer
# DjangoFilterBackend用于搜索 OrderingFilter用于排序
filter_backends = [DjangoFilterBackend]
# 分页
pagination_class = CustomPagination
# 搜索
filterset_class = UsersFilter
# 排序
# OrderingFilter默认所有字段都可以进行排序
# ordering_fields 只对指定的字段进行排序
ordering_fields = ('id', 'create_time')
# 返回序列化器类
def get_serializer_class(self):
# 如果操作表用UsersSerializer序列化器
if self.action=='update' or self.action=='partial_update':
return UsersSerializer
# 如果查询表用UserSerializer序列化器
else:
return UserSerializer
自关联接口
# 自关联
class MenuView(ModelViewSet):
queryset = Menu.objects.filter(parent_id=None)
serializer_class = MenuSerializer
配置二级路由
- 在api中创建urls.py文件
- 在根路由设置路由
- 在api中的urls…py文件中配置二级路由
DRF文档:https://www.django-rest-framework.org/
Django-filter文档:https://django-filter.readthedocs.io/en/latest/index.html