参考:http://www.cnblogs.com/neozheng/p/9838440.html
现总结:
1.字段精确过滤
第一步,添加django-fitlter扩展:
pip install django-filter
第二步,INSTALLED_APPS中添加应用:
INSTALLED_APPS = [
'django_filters',
]
第三步,settings文件中增加配置:
REST_FRAMEWORK = {
# drf过滤器
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
第四步,类视图引入类属性:
filter_fields = ['name']
第五步,开始使用:http://10.0.2.29:8000/role_manage/roles/?name=媒体运营,注意:精确匹配,过滤媒体无效.
2.字段模糊过滤
前面三步跟精确匹配完全一致
第四步,创建一个角色过滤器:
class RolesFilter(FilterSet):
"""角色过滤器"""
name = django_filters.CharFilter(field_name='name', lookup_expr="icontains") # icontains 包含,忽略大小写
class Meta:
model = Role # 关联的模型
fields = ['name'] # 过滤的字段
第五步,类视图引入类属性:
filterset_class = RolesFilter # 自定义角色过滤器
第六步,开始使用:http://10.0.2.29:8000/role_manage/roles/?name=媒体,注意:能实现模糊过滤
3.多表关联查询,一对多关系
参考了别人的第一种方法,get_query_set()方法
class HeroInfoViewSet(ModelViewSet):
queryset = HeroInfo.objects.all()
serializer_class = HeroInfoModelSerializer
def get_queryset(self): # 过滤方法; GenericAPIView 提供的方法
queryset = HeroInfo.objects.all()
book_name = self.request.query_params.get("book_name")
if book_name:
queryset = queryset.filter(hbook__btitle__contains=book_name)
hero_name = self.request.query_params.get("hero_name")
if hero_name:
queryset = queryset.filter(hname__contains=hero_name)
return queryset