【问题标题】:Can we use the concept of inheritance in Django rest framework in ModelViewSets?我们可以在ModelViewSets中使用Django rest框架中继承的概念吗?
【发布时间】:2020-04-21 20:11:52
【问题描述】:

我在不同的ModelViewSets 中一次又一次地重复我的代码,这里唯一改变的是模型的名称。所以,我想为此编写一个基类并将每个模型的名称作为参数发送,但它不起作用。

有什么帮助吗?

class RemitterQueryViewViewset(viewsets.ModelViewSet):
    queryset = RemitterQueryView.objects.all()
    serializer_class = RemitterQueryViewSerializer
    http_method_names = ['get']

    def get_base_path(self):
        splitted_url = self.request.build_absolute_uri().split('?')
        base_url = splitted_url[0]
        return base_url

    def get_queryset(self):
        limit = self.request.query_params.get('limit', 26)
        offset = self.request.query_params.get('offset', 0)
        filter_list = self.request.query_params.get('filter_list', None)
        sort_list = self.request.query_params.get('sort_list', None)
        if filter_list is None and sort_list is None:
            return RemitterQueryView.objects.filter(id__gt=int(offset))[0:int(limit)]

        elif filter_list is not None and sort_list is not None:
            filter_columns = self.get_filter_list()
            sort_columns = self.get_sort_list()
            sort_columns = list(itertools.chain(*sort_columns))
            return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns).order_by(*sort_columns)[0:int(limit)]

        elif filter_list is None and sort_list is not None:
            sort_columns = self.get_sort_list()
            sort_columns = list(itertools.chain(*sort_columns))
            return RemitterQueryView.objects.filter(id__gt=int(offset)).order_by(*sort_columns)[0:int(limit)]

        elif filter_list is not None and sort_list is None:
            filter_columns = self.get_filter_list()
            # print(filter_columns)
            # print(MockData.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)])
            return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)]

【问题讨论】:

    标签: django python-2.7 inheritance django-rest-framework


    【解决方案1】:

    你可以创建一个通用的mixin类,并在所有的CBV中继承这个mixin。

    class MixinView:
    
        def get_base_path(self):
            splitted_url = self.request.build_absolute_uri().split('?')
            base_url = splitted_url[0]
            return base_url
    
        def get_queryset(self):
            limit = self.request.query_params.get('limit', 26)
            offset = self.request.query_params.get('offset', 0)
            filter_list = self.request.query_params.get('filter_list', None)
            sort_list = self.request.query_params.get('sort_list', None)
            if filter_list is None and sort_list is None:
                return RemitterQueryView.objects.filter(id__gt=int(offset))[0:int(limit)]
    
            elif filter_list is not None and sort_list is not None:
                filter_columns = self.get_filter_list()
                sort_columns = self.get_sort_list()
                sort_columns = list(itertools.chain(*sort_columns))
                return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns).order_by(*sort_columns)[0:int(limit)]
    
            elif filter_list is None and sort_list is not None:
                sort_columns = self.get_sort_list()
                sort_columns = list(itertools.chain(*sort_columns))
                return RemitterQueryView.objects.filter(id__gt=int(offset)).order_by(*sort_columns)[0:int(limit)]
    
            elif filter_list is not None and sort_list is None:
                filter_columns = self.get_filter_list()
                # print(filter_columns)
                # print(MockData.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)])
                return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)]
    
    
    class RemitterQueryViewViewset(MixinView, viewsets.ModelViewSet):
        queryset = RemitterQueryView.objects.all()
        serializer_class = RemitterQueryViewSerializer
        http_method_names = ['get']
    

    您的 MixinView 中的 get_queryset 方法将在此处执行。

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多