Django Rest Framework 动态获取字段

箕水豹
• 阅读 5755

我写获取数据的API的时候,喜欢在URL中加入一个查询字段fields,用来过滤返回数据的字段,这样就可以做到我想返回哪些字段的数据就返回哪些字段的数据,减少网络传输的数据。
但是在使用Django Rest Framework的时候却发现框架默认并没有带有这样的功能。在网上进行搜索后在github上发现了一个名为“drf-dynamic-fields”的库,试用后发现问题完美解决了。

安装

项目名称:drf-dynamic-fields
项目描述:本项目提供了一个mixin,用于serializer,实现动态配置返回字段的效果。
github地址:https://github.com/dbrgn/drf-...

安装起来很简单,直接使用pip执行以下命令即可:

pip install drf-dynamic-fields

配置

在创建serializer的时候,把DynamicFieldsMixin这个mixin加上即可。
下面的代码是一个示例,我们创建了一个BookSerializer,加入了DynamicFieldsMixin。

from rest_framework import serializers
from drf_dynamic_fields import DynamicFieldsMixin
from .models import Book

class BookSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

然后,就可以直接用了~

使用

我们可以在url中使用fields来指定要返回的字段,例如我们在查询中仅需要获取图书的书名(name)和作者(author),那么URL可以写成这个样子,多个字段间使用逗号分隔即可:

GET https://knktc.com/book/?fields=name,author

当然对于获取单条信息的查询也同样好使:

GET https://knktc.com/book/666/?fields=name,author

如果我们仅仅需要某些字段不显示,则可以使用omit参数省略一些字段,例如我们在查询中其他的信息都要,但是图书描述信息字段(description)不要,那么我们可以把URL写成这个样子:

GET https://knktc.com/book/?omit=description

参考信息

作者在github项目中实际上说到为了保持项目的简单,实际上已经不再接受新需求的添加了,如果需要更强大的字段动态获取功能,则可以参考这个项目https://github.com/rsinger86/...

欢迎访问我的blog,获取更多后端问题解决方案: https://knktc.com/

点赞
收藏
评论区
推荐文章
kenx kenx
4年前
SpringBoot 默认json解析器详解和字段序列化自定义
前言在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理SpringBoot默认的json解析方案我们知道在springboot中有默认的json解析器,SpringBoot中默认使用的Json解析技术框架是ja
Wesley13 Wesley13
3年前
jabdp之字段修订
        在表单的字段属性中有一个字段修订启用的属性,勾选上这个属性后,就可以在审核通过的情况下,修改字段的值并保存数据到数据库汇中。!(https://oscimg.oschina.net/oscnet/up3cb2e48b95b3da9f8f0c60dea357c0e8388.png)具体效果看下图:!(https://os
xxkfz xxkfz
3年前
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
最近在使用Mybatis查询的时候,使用了BigDecimal类型的值进行查询,在控制台通过打印的sql发现,查询条件并没有拼接上去,导致查询失败。为了演示还原这个过程,特意写了一个简单的演示项目:比如:我现在查询productprice字段大于0的数据,数据库的数据如下所示:mapper.xml中配置如下:javaselecti
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
3年前
ELK学习笔记之配置logstash消费kafka多个topic并分别生成索引
0x00 filebeat配置多个topicfilebeat.prospectors:input_type:logencoding:GB2312fields_under_root:truefields:添加字段
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL IN语法注意事项一则
最近发现mysql中,Int型字段的默认值会直接影响IN语法的查询。如test表有个字段uid为int类型,默认值如果允许NULL,则下面的代码统计会不正确。//返回110条记录SELECTcount(1)FROMtest//若返回2条数据SELECT
Wesley13 Wesley13
3年前
F查询和Q查询,事务及其他
F查询和Q查询F查询在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?Django提供F()来做这样的比较。F()的实例可以在查询中引用字段,来比较同一个model实例中两个不同字段的值。示例1:查询出卖出数大于库存数的商品
Wesley13 Wesley13
3年前
Hibernate常见知识汇总
1.在数据库中条件查询速度很慢的时候,如何优化?1.建索引2.减少表之间的关联3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据2.在Hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果
Wesley13 Wesley13
3年前
mysql组合索引与字段顺序
很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符。看下面的例子:假设有一张订单表(orders),包含order\_id和product\_id二个字段。一共有31条数据。符合下面语句的数据有5条。执行下面的s
Wesley13 Wesley13
3年前
MongoDB(六):选择字段、限制记录数、排序记录
1\.选择字段在MongoDB中,选择字段又叫投影,表示仅选择所需要字段的数据,而不是选择整个文档字段的数据。如果某个文档有5个字段,但只要显示3个字段,那么就只选择3个字段吧,这样做是非常有好处的。find()方法在MongoDB查询文档中此方法接收的第二个可选参数是要检索的字段列表。在MongoDB中,当执行find()方法