- 在restframework中使用通用过滤后端进行过滤,官方教程中给的是使用通用视图类,其中大部分功能都已经写好,我们只需要将特定的参数配置好就可以使用
- 下面说一下,我使用的是Viewset视图进行编写,这个视图只是具备了restframework中一些基础的功能,大部分的逻辑需要自己去定义,对于需要高度定制自己的逻辑的开发者,可以使用这个基类
- 直接上代码:
1.首先配置settings文件:
REST_frameWORK = {
# Use Django's standard `django.contrib.auth` utils,
# or allow read-only access for unauthenticated users.
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
2. 编写视图函数
class FileViewSet(ViewSet):
filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
filter_fields = ('create_time',"file_owner__username","file_name")
def get_queryset(self):
return DataManager.objects.all()
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
def get_object(self, request, pk=None):
queryset = self.filter_queryset(self.get_queryset())
# Perform the lookup filtering.
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
obj = get_object_or_404(queryset, **filter_kwargs)
serializer = FileSerializer(obj,context={"request":request})
return Response(serializer.data)
def get_list(self, request):
queryset = self.filter_queryset(self.get_queryset())
serializer = FileSerializer(queryset, context={"request": request}, many=True)
return Response(serializer.data)
filter_fields:这个字段是我写这篇文章需要强调的地方,当进行过滤是,对于我们的常规字段,比如像charField字段,这种不需要特殊处理,而对于外键字段的话,我们需要通过反向查询来指定需要查询的字段,因为我们通过外键绑定的是对象,默认情况下是使用ID进行查询,但是这往往不是我们想要的,因为当用户进行查询或者过滤时,我们需要提供的是比如说想用户名或者时间等等参数,而不是数据库中对应的ID,我们通过外键绑定的是对象,这点要注意
好了这篇文章就写到这里了,如果有什么疑问的话,欢迎在下面评论区进行留言



