动态返回django rest框架序列化器字段的子集
drf-dynamic-fields的Python项目详细描述
这个包提供了一个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用户X17和rawbeans对my gist进行了改进 进入这个图书馆。谢谢!
- 对于其他贡献者,请参见Github contributor stats。
许可证
麻省理工学院许可证,请参阅LICENSE文件。