支持不同操作设置的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_classfilterset_classordering_fieldsordering对整个视图集进行参数化,还不如将此参数赋给每个操作。为此,请使用键等于操作名声明下一个字典。

序列化程序设置

必须提供serializer_classes字典才能使用GenericMultipleSettingsViewSet在视图中配置序列化程序。这个字典相当于genericapiviewserializer_class字段,它的值应该包含相同类型的值。

如果未提供serializer_classes或不包含已处理操作的值ViewConfigurationError,则将引发异常

过滤器设置

如果您还希望对不同的操作使用不同的过滤器集(这似乎是合乎逻辑的),那么您的视图集应该使用来自drf_multiple_settings.filter_backendspackage的过滤器后端。到目前为止,它只包含FilterBackend,它重写django_filters.rest_framework.DjangoFilterBackend,并允许您访问filterset_classes字典。这个字典相当于filterset_class字段,它的值应该包含相同类型的值。有关filterset_classdjango-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告诉序列化程序是否应该序列化多个元素。使用此方法的示例可以在示例部分找到。

方法设计为在动作修饰方法中使用。未测试外部操作的使用情况。

ModelViewSetReadonlyModelViewSet

drf提供两个默认视图集:

  • ModelViewSet用于具有模型的crud操作
  • ReadOnlyModelViewSet用于具有模型(listretrieve操作)的读取操作

为了方便使用,drf multiple settings提供了具有相同功能的GenericMultipleSettingsViewSet子类:

  • ModelMultipleSettingsViewSet
  • ReadOnlyModelMultipleSettingsViewSet

示例

对于本例,我们假设有以下内容:

  • 两个模型titleissue
  • 三个序列化程序
    • 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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
带有字符串的java JNA调用与带有字节[]的java JNA调用的行为不同   java基于键列表获取子映射   重启后永久增加java堆大小?   JavaHTTPS服务器:相互SSL身份验证   java为什么接受接口的方法会拒绝该接口的实现?   片段中的java视图无法应用于()   ms access Java SQL更新命令不工作   java将web服务自动打包和部署到Oracle Application Server 10g   java有没有办法在安卓 studio中为安卓时钟设置多个警报?   位于FTP服务器上的文件上的Java校验和md5   在Java中创建类时遇到问题。有些方法不太确定   java错误:在类chrome\u驱动程序中找不到主方法   通用海图(Javascript\Java)