问题:
视图类中,有增删改查,但是查只有根据url查全部或者查某个字段的一条数据,那么我是否可以筛选某个字段的所有数据而不是查某个数据呢?(筛选用户数据时需要)
1,根据源码,可以知道:
获取所有数据的源码是这样的:
获取单个数据的源码时这样的
关键点在于,获取单个数据的源码用了这个
这个是获取单个数据的函数
2,启发,是否可以把获取单个数据的函数换成过滤filter呢?想完就操作
在视图函数里面定义一个视图类,命名为PartModelMixin:
源码为:
class PartModelMixin:
other_field = 'group'
def part(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
self.lookup_field = self.other_field
self.lookup_url_kwarg = self.other_field
assert lookup_url_kwarg in self.kwargs, (
'Expected view %s to be called with a URL keyword argument '
'named "%s". Fix your URL conf, or set the `.lookup_field` '
'attribute on the view correctly.' %
(self.__class__.__name__, lookup_url_kwarg)
)
filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
queryset = queryset.filter(**filter_kwargs)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
关键的主要代码是
传入filter的是字典,要在前面加个**,这样就可以根据字典中的键值来过滤筛选(键是字段名,值是过滤值)
解释:通过获取url的参数,来进行过滤,过滤完之后分页,序列化并返回。
视图继承part类:
url这样写:
url('^api/v1/view1/$', views.View1.as_view({'get':'list', 'post':'create', 'delete':'destroy'}), name='view1'),
url('^api/v1/view1/(?P<pk>\d+)/$', views.View1.as_view({'get':'retrieve', 'delete':'destroy', 'put':'update', 'patch':'partial_update'}), name='view2'),
url('^api/v1/view1/part/(?P<pk>\d+)/$', views.View1.as_view({'get':'part'}), name='part'),
多加一行part的url。
这样,不用写多余的东西,根据url中的参数获取多个数据:
结果: