Django-rest-framework多条件查询/分页/多表Json
admin
2023-08-02 03:00:07
0

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"
        }
    ]
}


相关内容

热门资讯

特朗普称“日本导弹”打美国航母... 据日本共同社、NHK电视台等媒体7月9日报道,美国总统特朗普8日与乌克兰总统泽连斯基共同出席记者会时...
旧电视机遥控器失灵怎么办 如果你的旧电视机遥控器失灵了,你可以尝试以下几种方法: 1.更换电池:首先,你要检查遥控器的电池是...
电视遥控器失灵怎么办 当电视遥控器失灵时,我们可以采取以下方法进行处理: 1. 更换电池:如果电视遥控器没有响应,可能是...
飞利浦电视遥控器失灵电视按键失... 1、这种情况有可能是由于电视机的接收器出现了故障导致的。2、或者是电视遥控器和电视按键同时出现了故障...
开关机键失灵了怎么办? 1、关闭后台运行,清理手机垃圾,释放出更多的空间。2、如果手机已经进了灰尘,可以请专业人士进行拆机清...
小米电视机开关机设置方法 小米电视机是一款智能电视,提供了多种功能和设置。其中一个基本设置是开关机设置。以下是设置小米电视机开...
老挝正式成为上海合作组织对话伙... 今天(10日)上午,上海合作组织授予老挝人民民主共和国对话伙伴地位备忘录签署仪式在北京举行。在去年举...
这些中国人,为何对印度充满傲慢... 撰文丨任大刚最近几年,中国舆论对印度人的风评持续走低。01印度形象败坏简史先是硅谷的高管位置,逐渐被...
闻“汛”而动,向险而行!中国人... 7月5日,台风“美莎克”进入广西境内,对广西多地造成大面积的洪涝灾害。闻令而动,快速响应。灾情发生后...
中共中央党校(国家行政学院)李... 7月6日,中共中央党校(国家行政学院)科学社会主义教研部中国特色社会主义教研室主任、博士生导师,国内...