支持不同操作设置的DRF视图集
drf-multiple-settings的Python项目详细描述
支持不同操作设置的DRF视图集
目录
要求
django rest框架3.0+
安装
使用pip安装:
pip install drf-multiple-settings
用法
drf multiple settings为您提供类GenericMultipleSettingsViewSet,该类是drf的GenericViewSet的一个子类,并为操作添加了对不同设置的支持。
此视图集不包含任何操作,因此在使用它之前,您应该继承该类添加MIXIN和所需的动作(例如{TT6}$,^ {TT7}$以添加^ TT8}$和^ {TT9}$$)
与其使用serializer_class、filterset_class、ordering_fields和ordering对整个视图集进行参数化,还不如将此参数赋给每个操作。为此,请使用键等于操作名声明下一个字典。
序列化程序设置
必须提供serializer_classes字典才能使用GenericMultipleSettingsViewSet在视图中配置序列化程序。这个字典相当于genericapiviewserializer_class字段,它的值应该包含相同类型的值。
如果未提供serializer_classes或不包含已处理操作的值ViewConfigurationError,则将引发异常
过滤器设置
如果您还希望对不同的操作使用不同的过滤器集(这似乎是合乎逻辑的),那么您的视图集应该使用来自drf_multiple_settings.filter_backendspackage的过滤器后端。到目前为止,它只包含FilterBackend,它重写django_filters.rest_framework.DjangoFilterBackend,并允许您访问filterset_classes字典。这个字典相当于filterset_class字段,它的值应该包含相同类型的值。有关filterset_class和django-filter的详细信息,请访问django-filter documentation。
如果您使用的是在drf_multiple_settings.filter_backends中没有实现的过滤后端,请查看django过滤器的实现并编写自己的实现,这非常简单。请随时与我联系github,这样我就可以在包中包含其他filterbackend的实现。
订购设置
如果您也希望对不同的操作使用不同的排序设置(这似乎也是合乎逻辑的),那么您的视图集 应该使用MultipleSettingsOrderingFilter,这样您就可以访问这些词典:
- 排序字段字典:ordering_fields_set
- 默认排序词典:ordering_set
每个dictionary值都应该具有相应的normal genericapiview参数类型。参见django rest框架 如果您不确定它是什么,请提供文档。
get_response方法
GenericMultipleSettingsViewSet还提供get_response方法,用于使用当前操作的设置,使用您希望的任何数据呈现来自操作的响应。
defget_response(self,data,many):
此方法从data参数获取queryset如果需要,对其进行分页,然后使用序列化程序对其进行序列化,设置为此操作并将序列化数据返回为Response。参数many告诉序列化程序是否应该序列化多个元素。使用此方法的示例可以在示例部分找到。
方法设计为在动作修饰方法中使用。未测试外部操作的使用情况。
ModelViewSet和ReadonlyModelViewSet
drf提供两个默认视图集:
- ModelViewSet用于具有模型的crud操作
- ReadOnlyModelViewSet用于具有模型(list和retrieve操作)的读取操作
为了方便使用,drf multiple settings提供了具有相同功能的GenericMultipleSettingsViewSet子类:
- ModelMultipleSettingsViewSet
- ReadOnlyModelMultipleSettingsViewSet
示例
对于本例,我们假设有以下内容:
- 两个模型title和issue
- 三个序列化程序
- TitleListSerializer-s(英文)带有标题主要信息的列表器
- TitleDetailDerializer-带有标题详细信息的序列化程序
- IssueListSerializer
- 两个过滤器集类
- TitleFilter-标题过滤器
- IssueFilter-发出筛选器
我们希望创建具有以下url结构的只读api
- /title/-所有标题的列表
- /title/{id}-id={id}标题的详细信息
- /title/{id}/issues-id={id}的所有标题问题列表
此外,我们希望允许按名称对标题进行排序,并按名称、编号和发布日期发布,默认顺序为name升序和publish_date降序,并允许用户使用相应的filterset类筛选结果。
我们可以使用drf多个设置来实现这个api,如下所示(views.py):
fromdjango.shortcutsimportget_object_or_404fromdrf_multiple_settings.filter_backends.django_filtersimportFilterBackendfromdrf_multiple_settings.viewsetsimportReadOnlyModelMultipleSettingsViewSet,MultipleSettingsOrderingFilterfromrest_framework.decoratorsimportaction# ... Models and serializers imports...classTitleViewSet(ComicsDBBaseViewSet):queryset=models.Title.objects.all()filter_backends=(MultipleSettingsOrderingFilter,FilterBackend,)# Serializersserializer_classes={'list':TitleListSerializer,'retrieve':TitleDetailSerializer,'issues':IssueListSerializer}# FilterSetsfilterset_classes={'list':TitleFilter,'issues':IssueFilter}# Ordering Parametersordering_fields_set={'list':("name",),'issues':("name","number","publish_date")}ordering_set={'list':("name",),'issues':("-publish_date",),}@action(detail=True)# detail = True needed so DRF router include {id} in urldefissues(self,request,pk):title=get_object_or_404(models.Title,pk=pk)titles=title.issues.all()titles=self.filter_queryset(titles)returnself.get_response(titles,True)