to_representation 修改序列化的值
get_queryset 过滤信息
get_object 获取过滤数据
1 手动添加字段条件过滤
在视图文件下(views.py文件)
class StuView(viewsets.GenericViewSet,
mixins.ListModelMixin, # 查看所有资源,GET
mixins.RetrieveModelMixin, # 查看指定id的资源 ,GET
mixins.DestroyModelMixin, # 删除指定的资源 ,DELETE
mixins.CreateModelMixin, # 创建资源 ,POST
mixins.UpdateModelMixin): # 修改资源 ,PUT/PATCH
queryset = Student.objects.all()#指定资源返回的内容
serializer_class = StuSerializer# 资源(queryset)序列化的结果
filter_class = StuFilter 运用自己定义的过滤类对数据进行过滤
def get_queryset(self):
queryset = self.queryset
s_name = self.request.query_params.get('s_name')
if s_name:
获取未被删除且名字中含有输入的字的人
result = queryset.filter(is_delete=0, s_name__contains=s_name)
else:
result = queryset.filter(is_delete=0)
return result
2引入第三方库进行过滤
在定义过滤信息前需要在settings中添加相关设置
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
)
然后在当前应用下新建一个filters.py文件,在这个文件中写过滤信息
import django_filters
from app.models import Student
class StuFilter(django_filters.rest_framework.FilterSet):
# 引入第三方库进行过滤定义过滤类
# 指定模糊查询过滤的字段
name = django_filters.CharFilter('s_name', lookup_expr='contains')
前面的name为浏览器请求中问号后传的参,后面为数据库中的字段
# 不加lookup_expr = 'contains'就是精确查询,加就是模糊查询
age0 = django_filters.CharFilter('s_age', lookup_expr='gt')
age1 = django_filters.CharFilter('s_age', lookup_expr='lt')
上面的过滤条件既可以只过滤一条,也可以同时过滤上面的几个
class Meta:
model = Student
fields = ['name', 'age0', 'age1']
在上面的name = django_filters.CharFilter('s_name', lookup_expr='contains')语句中,前面的name为浏览器请求中问号后传的参,后面为数据库中的字段;不加lookup_expr = 'contains'就是精确查询,加就是模糊查询
上面的过滤条件如果只传了一个参数就只过滤一条,如果传了多个参数就过滤多个对应的信息
3安装toolbar测试工具
先安装库:pip install django-debug-toolbar
然后在settings中ALLOWED_HOSTS后面添加INTERNAL_IPS = ("127.0.0.1",)(添加测试ip)
中间件中添加中间件:'debug_toolbar.middleware.DebugToolbarMiddleware', # 添加debug中间件
添加应用:'debug_toolbar.apps.DebugToolbarConfig',
工程路由文件最后添加:
if DEBUG:
import debug_toolbar
urlpatterns.append(re_path(r'^__debug__/', include(debug_toolbar.urls)))
网友评论