支持不同操作设置的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语句的方法与面向表达式的方法   密码学如何在java中为json对象签名?   是否可以通过java程序知道给定卡夫卡消费群体的消费偏移量?   打印字符时出现java未知问号   java为JFrame设置背景色   在ubuntu中检查java版本时linux权限被拒绝   如何用java创建xml模式   java无法在远程服务器上运行Vaadin应用程序   java智能垃圾收集?   java如何在SpringMVC中设置缓存头?   在unix计算机上运行java应用程序a:>签名以输入内容   Java、Apache Commons配置XML属性   使用ArrayList调用Java未经检查的方法   在文本文件中查找并替换单词(Java GUI)   java Android Studio无法检测到JDK7或更新版本   java从socket的有效负载获取事件消息   安卓中java调用子类方法   java如何通过点击超链接来运行jar文件(Firefox)