温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-16 16:12:55 来源:网络 阅读:16988 作者:aqszhuaihuai 栏目:开发技术

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

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

def get_queryset(self):     """     使用request.query_params实现多条件查询,也可以使用django filter ,较简单的     方法是在filter_fields中指定要过滤的字段,但只能表示等值,不灵活,灵活的方式是     使用FilterSet,如下示例:     class ProductFilter(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')         class Meta:             model = Product             fields = ['category', 'in_stock', 'min_price', 'max_price']     class ProductList(generics.ListAPIView):         queryset = Product.objects.all()         serializer_class = ProductSerializer         filter_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()     if title is not None:         aQ.add(Q(title__startswith=title), Q.AND)     if language is not None:         aQ.add(Q(language=language), Q.AND)     if style is not None:         aQ.add(Q(style=style), Q.AND)     queryset = queryset.filter(aQ).order_by("-id")     return queryset


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

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


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

''' 关于Serializer,一般情况下,一个实体(Model)对应一个Serializer; 在涉及到表关联查询显示时,可以额外编写Serializer,包含关联表中 所需要的字段。 ''' class SnippetJoinUserSerializer(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')     class Meta:         model = Snippet         fields = ('id', 'title', 'code', 'linenos', 'language', 'style', 'owner',                   'email','user_id','last_login')

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

GET /snippet_join_users/ HTTP 200 OK Allow: GET, HEAD, OPTIONS Content-Type: application/json Vary: 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"         }     ] }


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI