将 Django REST API 转换为类似 GraphQL 的 API
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
Web API 是驱动我们当今大多数应用程序的核心引擎。多年来,REST 一直是 API 的主要架构,但在本文中,我们将探讨 Django 到 GraphQL 的集成库!
使用 REST API 时,您需要为每个可用的数据对象创建 URL。以书籍的 REST API 为例——我们需要为书籍本身、作者、奖项、角色和英雄等创建 URL……这已经够多了!这可能会导致大量的请求。
GraphQL 只有一个接口,你可以直接询问所需内容,并获得精确的响应。根据 2018 年 JS 现状报告,它是最受欢迎的技术之一,而且每周社区都会涌现出许多有趣的新成果,帮助用户快速上手。Yezyilomo提出了一个 Python 库的想法,可以将 Django Rest Framework 转换为类似 GraphQL 的 API。让我们来深入了解一下。
Django-restql 是一个库,它可以将您使用 Django REST Framework (DRF) 构建的 API 转换为类似 GraphQL 的 API。使用 django-restql,您可以:
- 向您的 API 发送查询,即可获得您所需的确切信息,不多也不少。
- 由于您可以控制从服务器获取的内容,因此可以获得预期结果。
- 控制你获取的数据,而不是服务器。
- 避免从服务器获取未使用数据的负载。
该库的工作原理是根据请求query参数,动态地为每个 DRF 资源选择字段子集。
将使用 Django REST Framework (DRF) 创建的 API 转换为类似 GraphQL 的 API。

Django RESTQL是一个 Python 库,它可以将使用Django REST Framework (DRF)构建的 API 转换为类似 GraphQL 的 API。借助Django RESTQL,您可以:
-
向您的 API 发送查询,即可获得您所需的一切,不多也不少。
-
控制你获取的数据,而不是服务器。
-
由于您可以控制从服务器获取的内容,因此可以获得可预测的结果。
-
在单个请求中获取嵌套资源。
-
避免数据过度获取和数据获取不足。
-
在单个请求中写入(创建和更新)任意级别的嵌套数据。
是不是很酷?
想看看这个库是如何实现这一切的吗?
请访问https://yezyilomo.github.io/django-restql查看完整文档。
或者在Django RESTQL Playground上尝试在线演示。
要求
- Python 版本 >= 3.6
- Django 版本 >= 1.11
- Django REST Framework >= 3.5
安装
pip install django-restql
入门
使用Django RESTQ进行查询……
关注Yezyilomo即可与他联系!
安装
pip install django-restql
入门
使用django-restql非常简单,只需在定义视图时使用 DynamicFieldsMixin 即可。
from rest_framework import viewsets
from django.contrib.auth.models import User
from .serializers import UserSerializer
from django_restql import DynamicFieldsMixin
class UserViewSet(DynamicFieldsMixin, viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
常规请求会返回 DRF 序列化器中指定的所有字段,实际上django-restql根本不处理这种请求:
GET /users
[
{
"id": 1,
"username": "yezyilomo",
"email": "yezileliilomo@hotmail.com",
"groups": [1,2]
},
...
]
django-restql处理所有query带参数的 GET 请求,该参数用于传递要包含在响应中的所有字段。例如,要从模型中选择字段id,请发送如下所示的带参数的请求。usernameuserquery
GET /users/?query=[["id", "username"]]
[
{
"id": 1,
"username": "yezyilomo"
},
...
]
如果查询包含嵌套字段,django-restql将返回该字段的 ID,如果是嵌套的可迭代字段(一对多或多对多),则会返回 ID 数组。例如,以下请求中location,一个是扁平嵌套字段(多对一),另一个groups是可迭代嵌套字段(一对多或多对多)。
GET /users/?query=[["id", "username", "location", "groups"]]
[
{
"id": 1,
"username": "yezyilomo",
"location": 6,
"groups": [1,2]
},
...
]
django-restql支持查询扁平化和嵌套资源,因此只要字段在序列化器中被定义为嵌套字段,您就可以在任何级别展开或查询嵌套字段。例如,您可以从位置字段查询国家/地区字段。
GET /users/?query=[["id", "username", {"location": ["country", "region"]}]]
[
{
"id": 1,
"username": "yezyilomo",
"location": {
"contry": "Tanzania",
"region": "Dar es salaam"
}
},
...
]
django-restql也支持展开或查询可迭代嵌套字段。例如,如果您想将groups字段展开为 ` idand` 和 `and` name,可以这样做。
GET /users/?query=[["id", "username" {"groups": [[ "id", "name" ]]}]]
[
{
"id": 1,
"username": "yezyilomo",
"groups": [
{
"id": 2,
"name": "Auth_User"
}
{
"id": 3,
"name": "Admin_User"
}
]
},
...
]
文章来源:https://dev.to/iamrobert/turn-django-rest-api-into-a-graphql-like-api-115h