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

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": "[email protected]",
            "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": "[email protected]",
            "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": "[email protected]",
            "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": "[email protected]",
            "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": "[email protected]",
            "user_id": 1,
            "last_login": "2016-12-11T03:50:40.909685Z"
        }
    ]
}
时间: 2024-12-10 16:51:20

Django-rest-framework多条件查询/分页/多表Json的相关文章

动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版

一.前言 多条件查询分页以及排序  每个系统里都会有这个的代码 做好这块 可以大大提高开发效率  所以博主分享下自己的6个版本的 多条件查询分页以及排序 二.目前状况 不论是ado.net 还是EF 在做多条件搜索时 都有这类似的代码 这样有几个不好的地方 1.当增加查询条件,需要改代码,对应去写相应的代码. 2.对多表查询以及or的支持 不是很好.而我们很常见的需求不可能是一个表的查询 3. 这样写表示层直接出现 了SQL语句 或者 linq 的拉姆达表达式  这是很不好的 表示层不应该知道数

基于Struts2、Spring、Hibernate实现的包含多条件查询分页的基础Dao层帮助jar包实现

操作数据库常用操作就是增删查改,每做一次就写一次这些操作太麻烦,也没必要,特别是写多条件查询并分页时,太痛苦了,所以抽空写了个dao帮助jar,导入即搞定!妈妈再有不用担心我的项目了! 转载请注明出处!!! 使用说明: 1.类的使用请参照文档说明,不懂可以结合例子demo! 2.分页jsp书写,只需将分页条件包在<form action="地址" id="pageForm">中即可,然后把jar中的pageJsp中的pageView.jsp拷出来,在数据

基于Struts2、Spring、Hibernate实现的包括多条件查询分页的基础Dao层帮助jar包实现

操作数据库经常使用操作就是增删查改.每做一次就写一次这些操作太麻烦,也不是必需,特别是写多条件查询并分页时.太痛苦了,所以抽出时间写了个dao帮助jar.导入即搞定!妈妈再有不用操心我的项目了! 转载请注明出处! ! ! 使用说明: 1.类的使用请參照文档说明,不懂能够结合样例demo. 2.分页jsp书写,仅仅需将分页条件包在<form action="地址" id="pageForm">中就可以.然后把jar中的pageJsp中的pageView.j

多条件查询分页

分页实现后,通过多条件查询后,内容如果需要分页,容易出现切换页面内容跳转到查询前的内容.解决方法可以通过将查询后的内容建表,然后在进行分页. <?php require_once "../wenjian/DBDA.class.php"; require_once "../wenjian/page.class.php"; // $obj = "select * from book WHERE is_delete= '0' "; $obj =

Django rest framework(7)----分页

Djiango rest  framework  分页 rest framework 为我们提供了3种分页:  1 PageNumberPagination  2  LimitOffsetPagination  3  CursorPagination 第一种分页  PageNumberPagination   这是一种我们比较常见的分页,就是显示第几页,一页显示多少条数据 我们可以在配置中指定每页显示多少条数据,还有在url 中指定参数page = 可以显示多少页 序列化表  api/utils

Django rest framework(七)----分页

第一种分页  PageNumberPagination 基本使用 (1)urls.py urlpatterns = [ re_path('(?P<version>[v1|v2]+)/page1/', Pager1View.as_view(),) #分页1 ] (2)api/utils/serializers/pager.py # api/utils/serializsers/pager.py from rest_framework import serializers from api imp

sql根据一个表查询的数据作为条件查询另一个表

代码格式如下: select * from BillConsume where obId in (select obId from OpenBills where clearTheMarket is null or clearTheMarket=0) 要注意的是:in后面的查询语句必须是查询一个字段跟前面的表相对应的.比如要根据订单号orderID,OpenBills 这个表就需要查询到orderID这个字段,BillConsume这个表的条件就要判断orderID

mysql带条件查询,联表查询

---恢复内容开始--- 1,用于设定所select出来的数据是否允许出现重复行(完全相同的数据行) all:允许出现--默认不写就是All(允许的). distinct:不允许出现--就是所谓的"消除重复行" 2,where:条件 3,group by:分组依据 后面加表的字段名,通常只进行一个字段的分组 mysql表查询语法形式:select [all | distinct] 字段名或表达式 from 表名 [where] [group by] [having] [order by

PHP-----多条件查询

在开发网页时,用谷歌和火狐浏览器,会比较好.IE浏览器不是太好用. 多条件查询 拿汽车表car,来做例子. 先把car表查出来,用表格来显示,在加一些查询的条件进去. 第一步:把car表查出来,用表格来显示 <table width="100%" border="1" cellpadding="0" cellspacing="0"> <tr> <td>代号</td> <td