如何过滤数据使用等于或大于url中的条件?

时间:2018-05-25 07:45:59

标签: python django django-rest-framework

我可以使用下面的链接来过滤id=16的数据:

http://localhost:8000/api/physicalservertask/list_for_home_workpanel/?id=16

这是我的列表api视图:

class PhysicalServerTaskListAPIView(ListAPIView):

    serializer_class = PhysicalServerTaskListSerializer
    permission_classes = [IsAdminUser]
    def get_queryset(self):
        query_params = self.request.query_params
        filters = {'{}__contains'.format(key): value
                   for key, value in query_params.items()
                   }

        return PhysicalServerTask.objects.filter(**filters)

我有一个问题,如何通过网址查询id>= 16的数据列表?

我的意思是我是否可以通过:

http://localhost:8000/api/physicalservertask/list_for_home_workpanel/?id__gte=16

过滤数据。

我知道我可以在ListAPIView查询中这样:

id_gte = self.request.query_params.copy().get('id_gte')
...
qs = PhysicalServerTask.objects.filter(**filters)
qs.filter(Q(id__gte=id__gte))

但是否有更方便的方法来实现这个目标?

2 个答案:

答案 0 :(得分:4)

您可以在视图中添加filter_fields属性,如下所示:

class PhysicalServerTaskListAPIView(ListAPIView):
    ...
    filter_fields = {
        'id': ['gte', 'lte']
    }

这将允许您进行如下查询:

http://localhost:8000/api/physicalservertask/list_for_home_workpanel/?id__gte=16

http://localhost:8000/api/physicalservertask/list_for_home_workpanel/?id__lte=16

为了实现这一目标,您需要install django-filter,并将DjangoFilterBackend添加到您的settings.py(如果它尚未存在):

REST_FRAMEWORK = {
    ...
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
}

filter_fields通常与精确查找的模型字段列表一起使用。但是,也可以提供字典,如上例所示,它将模型字段映射到其他类型的查找 - 例如gtelte

可以找到有关filter_fields属性的更多信息here。有关filter_fields的列表/字典格式的更多信息是here

答案 1 :(得分:0)

我想建议django-url-filter

从文档中可以看出

# get user who joined in after 2010 as per user profile
example.com/users/?profile__joined__gt=2010-01-01<br>

同样,它适合您的背景