Django Rest Framework 动态获取字段

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

安装

项目名称:drf-dynamic-fields

项目描述:本项目提供了一个mixin,用于serializer,实现动态配置返回字段的效果。

github地址:https://github.com/dbrgn/drf-dynamic-fields

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

pip install drf-dynamic-fields

如果不想在项目中多加一个库,也可以直接将项目中drfdynamicfields目录下的__init.py文件中的类直接复制出来到自己的项目中。 点击此处 直接下载init文件。

配置

在创建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/drf-flex-fields

评论