将使用django rest framework(drf)生成的api转换为类似于graphql的api。
django-restql的Python项目详细描述
django restql
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
模型中选择id
和username
字段,请发送带有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
字段扩展到id
和name
,下面是您的方法。
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的嵌套字段,同时保持简单性。
贡献
我们欢迎所有的贡献。请先阅读我们的CONTRIBUTING.md。你可以以pull requests或GitHub issues的形式提交任何想法。如果您想改进代码,请查看Code Style Guide并好时光!.