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中的参数获取多个数据:

结果:

 

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