在Django REST框架的ModelViewSets中可以使用继承的概念吗?

huangapple go评论97阅读模式
英文:

Can we use the concept of inheritance in Django rest framework in ModelViewSets?

问题

我正在一遍又一遍地重复我的代码,在不同的ModelViewSets中,唯一变化的是模型的名称。所以,我想为此编写一个基类,并将每个模型的名称作为参数传递,但它不起作用。

有任何帮助吗?

  1. class RemitterQueryViewViewset(viewsets.ModelViewSet):
  2. queryset = RemitterQueryView.objects.all()
  3. serializer_class = RemitterQueryViewSerializer
  4. http_method_names = ['get']
  5. def get_base_path(self):
  6. splitted_url = self.request.build_absolute_uri().split('?')
  7. base_url = splitted_url[0]
  8. return base_url
  9. def get_queryset(self):
  10. limit = self.request.query_params.get('limit', 26)
  11. offset = self.request.query_params.get('offset', 0)
  12. filter_list = self.request.query_params.get('filter_list', None)
  13. sort_list = self.request.query_params.get('sort_list', None)
  14. if filter_list is None and sort_list is None:
  15. return RemitterQueryView.objects.filter(id__gt=int(offset))[0:int(limit)]
  16. elif filter_list is not None and sort_list is not None:
  17. filter_columns = self.get_filter_list()
  18. sort_columns = self.get_sort_list()
  19. sort_columns = list(itertools.chain(*sort_columns))
  20. return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns).order_by(*sort_columns)[0:int(limit)]
  21. elif filter_list is None and sort_list is not None:
  22. sort_columns = self.get_sort_list()
  23. sort_columns = list(itertools.chain(*sort_columns))
  24. return RemitterQueryView.objects.filter(id__gt=int(offset)).order_by(*sort_columns)[0:int(limit)]
  25. elif filter_list is not None and sort_list is None:
  26. filter_columns = self.get_filter_list()
  27. return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)]
英文:

I'm repeating my code, again and again, in different ModelViewSets and the only thing that is changing here is the Model's name. So, I want to write a base class for this and send each model's name as an argument, but its not working.

Any help?

  1. class RemitterQueryViewViewset(viewsets.ModelViewSet):
  2. queryset = RemitterQueryView.objects.all()
  3. serializer_class = RemitterQueryViewSerializer
  4. http_method_names = ['get']
  5. def get_base_path(self):
  6. splitted_url = self.request.build_absolute_uri().split('?')
  7. base_url = splitted_url[0]
  8. return base_url
  9. def get_queryset(self):
  10. limit = self.request.query_params.get('limit', 26)
  11. offset = self.request.query_params.get('offset', 0)
  12. filter_list = self.request.query_params.get('filter_list', None)
  13. sort_list = self.request.query_params.get('sort_list', None)
  14. if filter_list is None and sort_list is None:
  15. return RemitterQueryView.objects.filter(id__gt=int(offset))[0:int(limit)]
  16. elif filter_list is not None and sort_list is not None:
  17. filter_columns = self.get_filter_list()
  18. sort_columns = self.get_sort_list()
  19. sort_columns = list(itertools.chain(*sort_columns))
  20. return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns).order_by(*sort_columns)[0:int(limit)]
  21. elif filter_list is None and sort_list is not None:
  22. sort_columns = self.get_sort_list()
  23. sort_columns = list(itertools.chain(*sort_columns))
  24. return RemitterQueryView.objects.filter(id__gt=int(offset)).order_by(*sort_columns)[0:int(limit)]
  25. elif filter_list is not None and sort_list is None:
  26. filter_columns = self.get_filter_list()
  27. # print(filter_columns)
  28. # print(MockData.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)])
  29. return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)]

答案1

得分: 1

你可以创建一个通用的混合类,并在所有的类视图中继承这个混合类。

  1. class MixinView:
  2. def get_base_path(self):
  3. splitted_url = self.request.build_absolute_uri().split('?')
  4. base_url = splitted_url[0]
  5. return base_url
  6. def get_queryset(self):
  7. limit = self.request.query_params.get('limit', 26)
  8. offset = self.request.query_params.get('offset', 0)
  9. filter_list = self.request.query_params.get('filter_list', None)
  10. sort_list = self.request.query_params.get('sort_list', None)
  11. if filter_list is None and sort_list is None:
  12. return RemitterQueryView.objects.filter(id__gt=int(offset))[0:int(limit)]
  13. elif filter_list is not None and sort_list is not None:
  14. filter_columns = self.get_filter_list()
  15. sort_columns = self.get_sort_list()
  16. sort_columns = list(itertools.chain(*sort_columns))
  17. return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns).order_by(*sort_columns)[0:int(limit)]
  18. elif filter_list is None and sort_list is not None:
  19. sort_columns = self.get_sort_list()
  20. sort_columns = list(itertools.chain(*sort_columns))
  21. return RemitterQueryView.objects.filter(id__gt=int(offset)).order_by(*sort_columns)[0:int(limit)]
  22. elif filter_list is not None and sort_list is None:
  23. filter_columns = self.get_filter_list()
  24. return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)]
  25. class RemitterQueryViewViewset(MixinView, viewsets.ModelViewSet):
  26. queryset = RemitterQueryView.objects.all()
  27. serializer_class = RemitterQueryViewSerializer
  28. http_method_names = ['get']

在这里,你的 MixinView 中的 get_queryset 方法将会被执行。

英文:

You can create a common mixin class and inherit this mixin in all CBV.

  1. class MixinView:
  2. def get_base_path(self):
  3. splitted_url = self.request.build_absolute_uri().split('?')
  4. base_url = splitted_url[0]
  5. return base_url
  6. def get_queryset(self):
  7. limit = self.request.query_params.get('limit', 26)
  8. offset = self.request.query_params.get('offset', 0)
  9. filter_list = self.request.query_params.get('filter_list', None)
  10. sort_list = self.request.query_params.get('sort_list', None)
  11. if filter_list is None and sort_list is None:
  12. return RemitterQueryView.objects.filter(id__gt=int(offset))[0:int(limit)]
  13. elif filter_list is not None and sort_list is not None:
  14. filter_columns = self.get_filter_list()
  15. sort_columns = self.get_sort_list()
  16. sort_columns = list(itertools.chain(*sort_columns))
  17. return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns).order_by(*sort_columns)[0:int(limit)]
  18. elif filter_list is None and sort_list is not None:
  19. sort_columns = self.get_sort_list()
  20. sort_columns = list(itertools.chain(*sort_columns))
  21. return RemitterQueryView.objects.filter(id__gt=int(offset)).order_by(*sort_columns)[0:int(limit)]
  22. elif filter_list is not None and sort_list is None:
  23. filter_columns = self.get_filter_list()
  24. # print(filter_columns)
  25. # print(MockData.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)])
  26. return RemitterQueryView.objects.filter(id__gt=int(offset), **filter_columns)[0:int(limit)]
  27. class RemitterQueryViewViewset(MixinView, viewsets.ModelViewSet):
  28. queryset = RemitterQueryView.objects.all()
  29. serializer_class = RemitterQueryViewSerializer
  30. http_method_names = ['get']

Here your get_queryset method from MixinView will get executed.

huangapple
  • 本文由 发表于 2020年1月3日 16:55:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/59575589.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定