将使用django rest framework(drf)生成的api转换为类似于graphql的api。

django-restql的Python项目详细描述


django restql

Build StatusLatest VersionPython VersionsLicense

django restql是一个python库,它允许您将使用django rest framework(drf)生成的api转换为类似于graphql的api。有了它,您将能够

  • 发送一个查询到你的api并得到你所需要的,不多也不少。

  • 控制你得到的数据,而不是服务器。

  • 获得可预测的结果,因为您可以控制从服务器获得的结果。

  • 保存从服务器获取未使用数据的负载。

很酷吧?.

安装

pipinstalldjango-restql

开始

使用django restql非常简单,定义序列化程序时只需继承DynamicFieldsMixin类。

fromrest_frameworkimportserializersfromdjango.contrib.auth.modelsimportUserfromdjango_restqlimportDynamicFieldsMixinclassUserSerializer(DynamicFieldsMixin,serializer.ModelSerializer):classMeta:model=Userfields=['id','username','email','groups']

常规请求返回drf序列化器上指定的所有字段,实际上django restql根本不处理此请求:

GET /users

[{"id":1,"username":"yezyilomo","email":"yezileliilomo@hotmail.com","groups":[1,2]},...]

django restql使用query参数处理所有get请求,此参数用于传递要包含在响应中的所有字段。例如,要从user模型中选择idusername字段,请发送带有query参数的请求,如下所示。

GET /users/?query={id, username}

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

django restql支持同时查询平面资源和嵌套资源,因此只要在序列化程序中将字段定义为嵌套字段,就可以在任何级别展开或查询嵌套字段。例如,可以从位置查询国家和地区字段。

GET /users/?query={id, username, location{country, region}}

[{"id":1,"username":"yezyilomo","location":{"contry":"Tanzania","region":"Dar es salaam"}},...]

django restql也支持查询iterable嵌套字段(一个2many或许多)。例如,如果您想将groups字段扩展到idname,下面是您的方法。

GET /users/?query={id, username, groups{id, name}}

[{"id":1,"username":"yezyilomo","groups":[{"id":2,"name":"Auth_User"}{"id":3,"name":"Admin_User"}]},...]

如果查询包含未展开的嵌套字段,并且未定义为序列化程序上的嵌套字段,django restql将返回其ID或嵌套iterable字段(one2many或many2many)的ID数组。例如,location下面的请求是一个扁平嵌套字段(many21),而groups是一个iterable嵌套字段(one2many或many2many)。

GET /users/?query={id, username, location, group}

[{"id":1,"username":"yezyilomo","location":6,"groups":[1,2]},...]

自定义django restql

django restql是非常可配置的,下面是您可以自定义的内容。

  • 更改query参数的名称。

    如果不想使用名称query作为参数,可以继承DynamicFieldsMixin,并按如下所示进行更改

    fromdjango_restql.mixinsimportDynamicFieldsMixinclassMyDynamicFieldMixin(DynamicFieldsMixin):query_param_name="your_favourite_name"

    现在可以在序列化器上使用这个MIXIN,并使用名{^ }作为参数。例如

    GET /users/?your_favourite_name={id, username}

  • 自定义如何筛选要包含在响应中的字段。 您可以通过继承继承和重写方法来实现这一点,如下所示。

    fromdjango_restql.mixinsimportDynamicFieldsMixinclassCustomDynamicFieldMixin(DynamicFieldsMixin):@propertydeffields(self):# Your customization herereturnfields
    < P> ^ {STR 1 } $注:为了能够做到这一点,必须了解如何实现^ {STR 1 } Django RESQLL ,特别是^ {STR 1 } $DigiFieldSmixIn<强>类,您可以检查它^ {A5}。实际上,这就是django restql的实现方式(只需重写序列化程序的field方法,无多无少)。

运行测试

python setup.py test

学分

  • 这个库的实现基于GraphQL背后的思想。
  • 这个库中执行过滤工作的最重要部分是由dictfier库支持的。
  • 我的目的是扩展drf-dynamic-fields库的功能,以支持更多的功能,比如允许在任何级别上查询平的和可iterable的嵌套字段,同时保持简单性。

贡献PRs Welcome

我们欢迎所有的贡献。请先阅读我们的CONTRIBUTING.md。你可以以pull requestsGitHub issues的形式提交任何想法。如果您想改进代码,请查看Code Style Guide并好时光!.

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

推荐PyPI第三方库


热门话题
java从JPanel附加到窗口事件   java如何正确使用ArrayList?   java无法将@Serialize与requestfactory一起使用   java Photoshop脚本框架   java需要根据一些业务逻辑设置多个处理程序   java计算字符串正则表达式中的字母   安卓[JAVA][Parse Html]如何模拟按下按钮   java logback。xml:仅覆盖一个类的根级别   java无法解析符号“IOUtils”   java中图像的swing平滑缩放   spring无法转换“java”类型的值。lang.String“到所需类型”java。提交表单时lang.Long'错误   java字符串索引超出范围:1个循环错误   客户端服务器简单java聊天应用程序读取图像   java在线程启动之前获取线程ID   后台服务中无摄像机视图的java opencv图像处理   java Firebase实时数据库:如何停止脱机写入?(最佳方法)   java OpenSessionView和commit事务