发布于 2026-01-06 1 阅读
0

将 Django REST API 转换为类似 GraphQL 的 API Django RESTQL DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

将 Django REST API 转换为类似 GraphQL 的 API

Django RESTQ

由 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 资源选择字段子集。

GitHub 标志 yezyilomo / django-restql

将使用 Django REST Framework (DRF) 创建的 API 转换为类似 GraphQL 的 API。

构建状态 最新版本 Python 版本 执照        下载 下载 下载

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
Enter fullscreen mode Exit fullscreen mode

入门

使用Django RESTQ进行查询……

关注Yezyilomo即可与他联系!

安装

pip install django-restql
Enter fullscreen mode Exit fullscreen mode

入门

使用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
Enter fullscreen mode Exit fullscreen mode

常规请求会返回 DRF 序列化器中指定的所有字段,实际上django-restql根本不处理这种请求:

GET /users

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

django-restql处理所有query带参数的 GET 请求,该参数用于传递要包含在响应中的所有字段。例如,要从模型中选择字段id,请发送如下所示的带参数的请求。usernameuserquery

GET /users/?query=[["id", "username"]]

    [
      {
        "id": 1,
        "username": "yezyilomo"
      },
      ...
    ]
Enter fullscreen mode Exit fullscreen mode

如果查询包含嵌套字段,django-restql将返回该字段的 ID,如果是嵌套的可迭代字段(一对多或多对多),则会返回 ID 数组。例如,以下请求中location,一个是扁平嵌套字段(多对一),另一个groups是可迭代嵌套字段(一对多或多对多)。

GET /users/?query=[["id", "username", "location", "groups"]]

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

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

GET /users/?query=[["id", "username", {"location": ["country", "region"]}]]

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

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"
            }
        ]
      },
      ...
    ]
Enter fullscreen mode Exit fullscreen mode
文章来源:https://dev.to/iamrobert/turn-django-rest-api-into-a-graphql-like-api-115h