django中restframework的視圖的增加

問題:

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

結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章