我可以使用下面的链接来过滤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))
但是否有更方便的方法来实现这个目标?
答案 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
通常与精确查找的模型字段列表一起使用。但是,也可以提供字典,如上例所示,它将模型字段映射到其他类型的查找 - 例如gte
和lte
。
可以找到有关filter_fields
属性的更多信息here。有关filter_fields
的列表/字典格式的更多信息是here。
答案 1 :(得分:0)
从文档中可以看出
# get user who joined in after 2010 as per user profile
example.com/users/?profile__joined__gt=2010-01-01<br>
同样,它适合您的背景