問題:
視圖類中,有增刪改查,但是查只有根據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中的參數獲取多個數據:
結果: