Skip to main content

将您使用 Django REST Framework(DRF) 制作的 API 转换为类似 GraphQL 的 API。

项目描述

Django RESTQL

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

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 模型中选择idusername字段,请发送带有 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 问题提交。如果您想改进代码,请查看代码样式指南并玩得开心!

项目详情