注意:该文章部分摘抄之百度,仅当做学习笔记供小白使用,若侵权请联系删除!
显示关联表的数据,本示例会显示所有的关联的数据信息
from rest_framework import serializers
from .models import Student
class StudentModelSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = "__all__"
读取到的结果器数据关联的为数字,此时需要进行一些操作可以读到正确数据
方法1: source='字段名.关联属性值'
from rest_framework import serializers
from drf_app import models
# 文章的Serializer
class ArticleSerializer(serializers.ModelSerializer):
category = serializers.CharField(source='category.name')
class Meta:
model = models.Article
fields = ['id','title','summary','content','category']
方法2 : 返回其属性值
from rest_framework import serializers
from . import models
# 文章的Serializer
class ArticleSerializer(serializers.ModelSerializer):
category = serializers.SerializerMethodField()
class Meta:
model = models.Article
fields = ['id', 'title', 'summary', 'content', 'category']
def get_category(self, obj): # obj是表中的一行记录的对象
return obj.category.name
显示choice类型字段的对应数据
# 方法1
status = serializers.CharField(source='get_status_display')
# 方法2
class Meta:
def get_category(self,obj): #obj是表中的一行记录的对象
return get_status_display()
认证&权限
权限选项:
- AllowAny # 容许所有用户
- IsAuthenticated # 仅通过认证的用户
- IsAdminUser # 仅管理员用户
- IsAuthenticatedOrReadOnly # 只有认证的用户可以完全操作,其他可以可读
# 全局认证&权限配置
REST_FRAMEWORK ={
'DEFAULT_AUTHENTICATION_CLASSES':(
'rest_framework.authentication.BasicAuthentication', # Basic 认证
'rest_framework.authentication.SessionAuthentication', # Session 认证
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permission.IsAuthenticated' # 全局权限管理 登录的用户才可以访问
), # 若无此配置,默认所有用户可以访问,rest_framework.permission.AllowAny
}
# view 单个视图认证&权限
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class MyView(APIView):
# 指定认证的方式 # 401 未认证 403 权限被禁止
authentication_classes = (SessionAuthentication,BasicAuthentication)
permission_classes = (IsAuthenticated)
# url 文件配置
# DRF自带的登录接口认证
path('api-auth/',include('rest_framework.urls')) # 登录接口的配置,已封装注销及登录接口
限流: 限制接口的访问频率,减少服务器的压力(反爬虫)
REST_FRAMEWORK ={
# 限流,全局默认配置
'DEFAULT_THROTTLE_CLASSES':[
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
],
# 设置用户的访问频率,局部用户限制,通过使用UserRateThrottle来限制用户的访问频率
'DEFAULT_THROTTLE_RATES': {
# 时间周期 second/minute/hour/day
'anon':'10/day' , # 未认证的用户 10/day
'user':'1000/day' # 认证的用户 100/day
}
}
# 局部配置调用视图view
from rest_framework.throttling import UserRateThrottle
class MyView(APIView):
# 限流,限制用户的访问频率
throttle_classes = (UserRateThrottle)
限流类型
- AnonRateThrottle
- 限制所有匿名未认证的用户,使用IP区分
- 使用DEFAULT_THROTTLE_RATES['anon'] 来设置频率
- UserRateThrottle
- 限制认证用户,使用用户ID区分
- 使用DEFAULT_THROTTLE_RATES['anon'] 来设置频率
- ScopedRateThrottle
- 限制用户对于具体视图的访问频率,使用IP或ID区分
- 视图中使用throttle_scope 制定频率
全局配置
- DEFAULT_THROTTLE_CLASSES: 设置限流类型
- DEFAULT_THROTTLE_RATES: 设置限制的频率
过滤:使用列表数据过滤字段信息,可使用django-fitlter扩展支持
pip install django-filter # 安装过滤器
# 注册app
'django_filters'
# 指定过滤器
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS':(
'django_filters.rest_framework.DjangoFilterBackend'
)
}
# 方式1 自定义字段过滤
filterset_fields = ('age',)
# 方法2 自定义过滤类
filterset_class = UserInfoFilter
from app.models import UserInfo
from django_filters import rest_framework as filters
class UserInfoFilter(filters.FilterSet):
"""自定义过滤器类"""
# 自定义字段过滤
min_age = filters.NumberFilter(field_name='age',lookup_expr='gte')
max_age = filters.NumberFilter(field_name='age',lookup_expr='lte')
# 关联字段需要 关联字段__属性 实现
name = filters.CharFilter(field_name='user__name')
class Meta:
model = UserInfo
fields = ['name','age']
接口文档:DRF 自动生成网页版的接口文档,其生成的是继承APIView及其子类的视图
pip install coreapi # 安装依赖
# setting 配置
REST_FRAMEWORK = {
# 接口文档配置
'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema',
}
# url 配置
from django.urls import path,include,re_path
from rest_framework.documentation import include_docs_urls
urlpatterns = [
re_path(r'^docs/',include_docs_urls(title='接口文档'))
]
排序:DRF提供OrderingFilter可快速实现数据的指定方式排序
# 局部信息配置
serializer_class =xxxserializer
filter_backends = [OrderingFilter] # 指定排序的过滤器
ordering_fields = ('age''id') # 指定字段
# 指定ordering参数字段对数据集进行排序 xxx/?ordering=age
# 全局配置信息
REST_FRAMEWORK = {
# 指定过滤器
'DEFAULT_FILTER_BACKENDS':(
# 指定django_filters的过滤器过滤
'django_filters.rest_framework.DjangoFilterBackend',
# 指定DRF自带的排序过滤器来进行数据排序
'rest_framework.filters.OrderingFilter'
),
}
分页:
# 全局配置
REST_FRAMEWORK = {
# 分页 全局配置
'DEFAULT_PAGINATION_CLASS':'rest_frame.pagination.PageNumberPagination',
'PAGE_SIZE': 10 # 每页数据量
}
# 局部配置
from rest_framework.pagination import PageNumberPagination
class UserInfoPagination(PageNumberPagination):
page_size = 5 # 每页数据量
page_query_param = 'page' # 页面关键字参数,默认 'page'
page_size_query_param = 'size' # 前端的每页面关键字参数 默认None
max_page_size = 100 # 每页的数据量的最大值
class MyView(APIView):
"""
局部配置,可通过pagination_class属性实现不同的分页器
"""
pagination_class = UserInfoPagination
异常处理:
# setting 配置
REST_FRAMEWORK = {
# 异常处理配置
# 'EXCEPTION_HANDLER':'rest_framework.views.exception_handler',
# 自定义异常的处理函数接口
'EXCEPTION_HANDLER':'common.exception.my_exception_handler',
}
# 自定义异常处理
from rest_framework.views import exception_handler,Response,status
def custom_exception_handler(exc,context):
response = exception_handler(exc,context)
if response is not None:
response.data['status_code'] = response.status_code
else:
data ={'error':'服务器出错了'}
response =Response(data,status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return response
文件上传:文章来源:https://www.toymoban.com/news/detail-828650.html
- ImageField # 上传图片
- FileField # 上传文件
# model 配置
class ImageModel(models.Model):
# file = models.FileField() # 保存文件的字段
file = models.ImageField() # 用于保存图片文件的字段
class Meta:
db_table = 'image'
verbose_name = '图片'
# serial 序列化
from rest_framework import serializers
from models import UserInfo,ImageModel
class ImageSerializer(serializers.ModelSerializer):
'图片关联序列化'
class Meta:
model = ImageModel
fields = '__all__'
#setting 配置
# 指定文件上传存放的路径
MEDIA_ROOT = BASE_DIR / 'image'
# 指定文件url的路径
MEDIA_URL = ''
# view视图配置
from .models import models,ImageModel
from rest_framework.viewsets import ModelViewSet,mixins,GenericViewSet
from .serializers import ImageSerializer
class ImageView(mixins.CreateModelMixin,mixins.RetrieveModelMixin,
mixins.ListModelMixin,GenericViewSet):
queryset = ImageModel.objects.all()
serializer_class = ImageSerializer
文件的上传和获取下载方式自定义优化文章来源地址https://www.toymoban.com/news/detail-828650.html
from .models import models,ImageModel
from rest_framework.viewsets import ModelViewSet,mixins,GenericViewSet
from django.http import FileResponse
from .serializers import ImageSerializer
class ImageView(mixins.CreateModelMixin,mixins.RetrieveModelMixin,
mixins.ListModelMixin,GenericViewSet):
queryset = ImageModel.objects.all()
serializer_class = ImageSerializer
# 上传文件优化,限制文件的上传大小
def create(self, request, *args, **kwargs):
pic = request.data.get('files')
size,name,type = pic.size,pic.name,pic.content_type
if size>1024*30:
return Response({'error':'图片不可以超过30kb'},status=status.HTTP_400_BAD_REQUEST)
elif type not in ['image/png','image/jpg']:
return Response({'error':'你上传的文件格式有问题'},status=status.HTTP_400_BAD_REQUEST)
else:
return super().create(request,*args,**kwargs)
def retrieve(self, request, *args, **kwargs): # 照片获取下载
pic = self.get_object()
path = pic.files.path
return FileResponse(open(path),'rb')
def get_image(request,name):
path = MEDIA_ROOT / name
return FileResponse(open(path,'rb'))
# url 配置
urlpatterns = [
re_path('image/(.+?)/',views.get_image)
]
到了这里,关于django rest framework 学习笔记2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!