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

qg_*_*137 5 python django django-rest-framework

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

http://localhost:8000/api/physicalservertask/list_for_home_workpanel/?id=16
Run Code Online (Sandbox Code Playgroud)

这是我的列表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)
Run Code Online (Sandbox Code Playgroud)

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

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

http://localhost:8000/api/physicalservertask/list_for_home_workpanel/?id__gte=16
Run Code Online (Sandbox Code Playgroud)

过滤数据。

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

id_gte = self.request.query_params.copy().get('id_gte')
...
qs = PhysicalServerTask.objects.filter(**filters)
qs.filter(Q(id__gte=id__gte))
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*ing 6

您可以filter_fields像这样向视图添加属性:

class PhysicalServerTaskListAPIView(ListAPIView):
    ...
    filter_fields = {
        'id': ['gte', 'lte']
    }
Run Code Online (Sandbox Code Playgroud)

这样您就可以进行查询,例如:

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

http://localhost:8000/api/physicalservertask/list_for_home_workpanel/?id__lte=16
Run Code Online (Sandbox Code Playgroud)

为此,您需要安装django-filter,如果尚不存在,请将其添加DjangoFilterBackend到您的系统中settings.py

REST_FRAMEWORK = {
    ...
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
}
Run Code Online (Sandbox Code Playgroud)

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

有关该filter_fields属性的更多信息,请参见此处。在列表/字典格式的详细信息filter_fields在这里