将您使用 Django REST Framework(DRF) 制作的 API 转换为类似 GraphQL 的 API。
项目描述
Django RESTQL
Django RESTQL是一个 python 库,它允许您将使用Django REST 框架(DRF)制作的 API 转换为类似 GraphQL 的 API。使用Django RESTQL,您将能够
-
向您的 API 发送查询并准确获取您需要的内容,不多也不少。
-
控制您获得的数据,而不是服务器。
-
获得可预测的结果,因为您可以控制从服务器获得的内容。
-
在单个请求中获取嵌套资源。
-
避免数据的过度获取和获取不足。
-
在单个请求中写入(创建和更新)任何级别的嵌套数据。
是不是很酷?
想看看这个图书馆是如何让这一切成为可能的吗?
在https://yezyilomo.github.io/django-restql查看完整的文档
或者尝试在Django RESTQL Playground上进行现场演示
要求
- 蟒蛇> = 3.6
- Django >= 1.11
- Django REST 框架 >= 3.5
安装
pip install django-restql
入门
使用Django RESTQL查询数据非常简单,只需要DynamicFieldsMixin在定义序列化器时继承类即可。
from rest_framework import serializers
from django.contrib.auth.models import User
from django_restql.mixins import DynamicFieldsMixin
class UserSerializer(DynamicFieldsMixin, serializer.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email']
Django RESTQL使用参数处理所有请求query,该参数用于传递响应中包含/排除的所有字段。例如,要从 User 模型中选择id和username字段,请发送带有 query参数的请求,如下所示。
GET /users/?query={id, username}
[
{
"id": 1,
"username": "yezyilomo"
},
...
]
Django RESTQL支持查询平面和嵌套资源,因此您可以在序列化程序上定义的任何级别扩展或查询嵌套字段。在下面的示例中,我们将location用户模型作为嵌套字段。
from rest_framework import serializers
from django.contrib.auth.models import User
from django_restql.mixins import DynamicFieldsMixin
from app.models import GroupSerializer, LocationSerializer
class LocationSerializer(DynamicFieldsMixin, serializer.ModelSerializer):
class Meta:
model = Location
fields = ['id', 'country', 'city', 'street']
class UserSerializer(DynamicFieldsMixin, serializer.ModelSerializer):
location = LocationSerializer(many=False, read_only=True)
class Meta:
model = User
fields = ['id', 'username', 'email', 'location']
如果您在检索用户时只想要一个字段上的字段country,那么您可以这样做citylocation
GET /users/?query={id, username, location{country, city}}
[
{
"id": 1,
"username": "yezyilomo",
"location": {
"contry": "Tanzania",
"city": "Dar es salaam"
}
},
...
]
您甚至可以在查询数据时重命名字段,在下面的示例中,字段location被重命名为address
GET /users/?query={id, username, address: location{country, city}}
[
{
"id": 1,
"username": "yezyilomo",
"address": {
"contry": "Tanzania",
"city": "Dar es salaam"
}
},
...
]
文档:铅笔:
除了查询数据之外,您还可以使用Django RESTQL做很多事情,例如
- 重命名字段
- 限制嵌套字段上的某些字段
- 定义自引用嵌套字段
- 优化嵌套字段的数据获取
- 使用查询参数进行数据过滤和分页
- 数据突变(在单个请求中创建和更新任何级别的嵌套数据)
该项目的完整文档可在https://yezyilomo.github.io/django-restql获得,建议您阅读它以充分利用该库。
Django RESTQL 游乐场
Django RESTQL Play Ground是一个图形化、交互式的浏览器内工具,您可以使用它来测试Django RESTQL功能,如数据查询、突变等,以便在安装之前了解库的工作原理。它更像是 Django RESTQL 的现场演示,可在https://django-restql-playground.yezyilomo.me获得
运行测试
python runtests.py
学分
- 这个库的实现基于GraphQL背后的思想。
- 我的目的是扩展drf-dynamic-fields库的功能以支持更多功能,例如允许在任何级别查询平面和可迭代的嵌套字段,并允许在保持简单性的同时写入嵌套字段。
贡献
我们欢迎所有的贡献。请先阅读我们的CONTRIBUTING.md。您可以将任何想法作为拉取请求或GitHub 问题提交。如果您想改进代码,请查看代码样式指南并玩得开心!