Django-rest-framework多条件查询/分页/多表Json

django-rest-framework多条件查询需要覆写ListAPIView.get_queryset方法,代码示例:

defget_queryset(self):"""使用request.query_params实现多条件查询,也可以使用djangofilter,较简单的方法是在filter_fields中指定要过滤的字段,但只能表示等值,不灵活,灵活的方式是使用FilterSet,如下示例:classProductFilter(django_filters.rest_framework.FilterSet):min_price=django_filters.NumberFilter(name="price",lookup_expr='gte')max_price=django_filters.NumberFilter(name="price",lookup_expr='lte')classMeta:model=Productfields=['category','in_stock','min_price','max_price']classProductList(generics.ListAPIView):queryset=Product.objects.all()serializer_class=ProductSerializerfilter_backends=(django_filters.rest_framework.DjangoFilterBackend,)filter_class=ProductFilter"""queryset=Snippet.objects.all()title=self.request.query_params.get('title',None)language=self.request.query_params.get('language',None)style=self.request.query_params.get('style',None)aQ=Q()iftitleisnotNone:aQ.add(Q(title__startswith=title),Q.AND)iflanguageisnotNone:aQ.add(Q(language=language),Q.AND)ifstyleisnotNone:aQ.add(Q(style=style),Q.AND)queryset=queryset.filter(aQ).order_by("-id")returnqueryset


至于分页,只需要在View中指定分页类,或者在settings.py中指定

pagination_class=StandardResultsSetPagination#或setting.pyREST_FRAMEWORK={'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination','PAGE_SIZE':100}


涉及到多表的Json,重新编写Serializer,附加上所需要的字段,在View中使用新的Serializer。

'''关于Serializer,一般情况下,一个实体(Model)对应一个Serializer;在涉及到表关联查询显示时,可以额外编写Serializer,包含关联表中所需要的字段。'''classSnippetJoinUserSerializer(ModelSerializer):owner=serializers.ReadOnlyField(source='owner.username')email=serializers.ReadOnlyField(source='owner.email')user_id=serializers.ReadOnlyField(source='owner.id')last_login=serializers.ReadOnlyField(source='owner.last_login')classMeta:model=Snippetfields=('id','title','code','linenos','language','style','owner','email','user_id','last_login')

输出结果就是包含了user信息的Json。

GET/snippet_join_users/HTTP200OKAllow:GET,HEAD,OPTIONSContent-Type:application/jsonVary:Accept{"count":8,"next":"http://127.0.0.1:8000/snippet_join_users/?page=2","previous":null,"results":[{"id":8,"title":"test8","code":"test","linenos":false,"language":"abap","style":"algol","owner":"admin","email":"test@test.com","user_id":1,"last_login":"2016-12-11T03:50:40.909685Z"},{"id":7,"title":"test7","code":"test","linenos":false,"language":"abap","style":"algol","owner":"admin","email":"test@test.com","user_id":1,"last_login":"2016-12-11T03:50:40.909685Z"},{"id":6,"title":"test6","code":"test","linenos":false,"language":"abap","style":"algol","owner":"admin","email":"test@test.com","user_id":1,"last_login":"2016-12-11T03:50:40.909685Z"},{"id":5,"title":"test5","code":"test","linenos":false,"language":"abap","style":"algol","owner":"admin","email":"test@test.com","user_id":1,"last_login":"2016-12-11T03:50:40.909685Z"},{"id":4,"title":"test4","code":"test","linenos":false,"language":"abap","style":"algol","owner":"admin","email":"test@test.com","user_id":1,"last_login":"2016-12-11T03:50:40.909685Z"}]}