动态返回django rest框架序列化器字段的子集

drf-dynamic-fields的Python项目详细描述


Build statusPyPI VersionPyPI DownloadsLicense is MIT

这个包提供了一个MIXIN,允许用户动态地只选择一个 每个资源的字段子集。

官方版本支持:

  • Django 1.11、2.0、2.1
  • 支持的rest框架版本:3.8、3.9
  • python 2.7(已弃用),3.4+

注意:不推荐使用Python2支持,将在0.4版中删除。

安装

pip install drf-dynamic-fields

它的功能

示例序列化程序:

classIdentitySerializer(DynamicFieldsMixin,serializers.HyperlinkedModelSerializer):classMeta:model=models.Identityfields=('id','url','type','data')

常规请求返回所有字段:

GET /identities

[{"id":1,"url":"http://localhost:8000/api/identities/1/","type":5,"data":"John Doe"},...]

另一方面,带有字段参数的查询只返回 字段:

GET /identities/?fields=id,data

[{"id":1,"data":"John Doe"},...]

并且带有ommit参数的查询排除指定的字段。

GET /identities/?omit=data

[{"id":1,"url":"http://localhost:8000/api/identities/1/","type":5},...]

您可以在同一请求中同时使用字段和省略

GET /identities/?omit=data,fields=data,id

[{"id":1},...]

尽管你为什么要做这样的事超出了作者的理解。

它也适用于单个对象!

GET /identities/1/?fields=id,data

{"id":1,"data":"John Doe"}

用法

定义序列化程序时,请使用DynamicFieldsMixin

fromdrf_dynamic_fieldsimportDynamicFieldsMixinclassIdentitySerializer(DynamicFieldsMixin,serializers.ModelSerializer):classMeta:model=models.Identityfields=('id','url','type','data')

MIXIN需要访问^ {TT7}$$对象。一些drf类,比如 ModelViewSet默认设置,但如果您自己处理序列化程序, 通过上下文传入请求:

events=Event.objects.all()serializer=EventSerializer(events,many=True,context={'request':request})

警告

如果请求上下文无权访问该请求,则警告为 发射:

UserWarning: Context does not have access to request.

首先,确保将请求传递给序列化程序上下文(请参见 “使用”部分)。

在某些情况下(例如,嵌套序列化程序),您无法除去 这样警告(请参见issue 27)。 在这种情况下,您可以通过settings.py

DRF_DYNAMIC_FIELDS={'SUPPRESS_CONTEXT_WARNING':True,}

范围

此库是关于根据单个请求筛选字段的。它是 故意保持简单,我们不打算添加新功能。随便吧 尽管如此,还是要做出改进、代码简化和错误修复!(另见: #18

如果你需要更高级的过滤功能,也许drf-flex-fields可以为你做点什么。

测试

要运行测试,请安装django和drf,然后运行runtests.py

$ python runtests.py

学分

  • 实现基于thisstackoverflow应答。谢谢 YAtOff
  • github用户X17rawbeansmy gist进行了改进 进入这个图书馆。谢谢!
  • 对于其他贡献者,请参见Github contributor stats

许可证

麻省理工学院许可证,请参阅LICENSE文件。

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

推荐PyPI第三方库


热门话题
java使用Eclipse Helios for Web项目   java指定行。作为编译器设置的分隔符?   osm映射中带有osmdroid的java标记   java Android ClassNotFoundException在路径:DexPathList上未找到类   java从j2me调用GWT方法   更新到java 8后的aspectj问题   如何仅从根元素java,com提取文本内容。滴虫软件。是的。html   安卓公司。谷歌。火基。数据库DatabaseException:未能转换java类型的值。将字符串改为长字符串   从java中的方法返回arraylist变量   java如果将引用重新分配给同步块内的锁对象,会是什么?   java下载。使用spring mvc的资源文件中的xlsx文件   java Eclipse提供了什么工具来运行Eclipse中未包含的程序?   spring boot Java泛型如何读取传递给泛型方法的类型上的字段或调用方法   Javacard中的javaecdsa签名