如何使用Python和Django创建GraphQL API - Refine开发指南

作者:API传播员 · 2025-10-08 · 阅读时间:4分钟
本文详细介绍了如何使用Python和Django框架创建GraphQL API,特别针对学校管理系统的开发场景。通过GraphQL的高效查询语言,开发者可以精准获取所需数据,减少冗余请求,提升系统性能。文章涵盖了从创建开发环境、定义数据模型到实现GraphQL API的全过程,包括使用Graphene-Django库的具体步骤和代码示例。

一. GraphQL 概述

GraphQL 是一种高效的查询语言,专为与数据库通信而设计,尤其适用于复杂数据结构场景。它允许前端仅获取所需数据,从而减少冗余请求。通过强类型模式和固定数据结构,GraphQL 提高系统的可靠性和一致性,即使后端发生变化,前端开发人员也无需额外调整。

GraphQL 在后端创建数据层,定义向前端提供数据的 API。它能够精准获取特定数据,减少网络使用,提高系统性能。例如,在微服务架构中,通过一个 GraphQL 端点即可整合多个服务的数据,减少前端请求次数。


二. 使用 Python 和 Django 创建 GraphQL API

本文将为学校管理系统构建 GraphQL API,该系统包含学生、教师和课程之间的关系。我们将实现一个 API,用于获取课程及其注册学生和分配教师信息。

1. 所需工具和技术栈

  • Python:从 Python 官网 下载并安装适合的版本(本文使用 Windows 系统和 Python 3.12.3)。
  • Django:作为 Web 框架,加速开发并提供完善的 ORM 支持。
  • Graphene-Django:用于在 Django 中实现 GraphQL API 的库。

2. 创建开发环境

  1. 创建虚拟环境

    python -m venv smsvenv

    激活虚拟环境后,所有依赖项(如 Django 和 Graphene-Django)都将在此环境中安装。

  2. 安装依赖项

    pip install django graphene-django
  3. 创建项目结构
    使用 Django 命令创建项目文件夹结构,并将 graphene-djangoschool 添加到 school_management/settings.py 中:

    INSTALLED_APPS = [
       ...
       'graphene_django',
       'school',
    ]
  4. 配置数据库
    默认使用 SQLite:

    DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.sqlite3',
           'NAME': BASE_DIR / 'db.sqlite3',
       }
    }

三. 定义数据模型

school/models.py 中为学生、教师和课程定义 Django ORM 模型及其关系:

  1. 多对多关系:学生可注册多门课程,课程可有多个学生。
  2. 一对多关系:每门课程由一名教师教授,但教师可教授多门课程。

四. 插入示例数据

通过 Django Admin 界面创建学生、教师和课程的示例数据:

  1. admin.py 中注册模型。
  2. 使用 Django Admin 添加数据以便测试 API。

五. 实现 GraphQL API

1. 集成 Graphene-Django

school/ 目录创建 schema.py 文件,包含以下两个主要部分:

  • 类型(Types):定义客户端请求的数据结构。
  • 查询与解析器(Queries and Resolvers):从数据库获取数据的查询定义。

2. 定义 GraphQL 类型

使用 DjangoObjectType 将 Django 模型转换为 GraphQL 类型:

import graphene
from graphene_django.types import DjangoObjectType
from .models import Student, Teacher, Course

class StudentType(DjangoObjectType):
    class Meta:
        model = Student

class TeacherType(DjangoObjectType):
    class Meta:
        model = Teacher

class CourseType(DjangoObjectType):
    class Meta:
        model = Course

3. 定义查询

示例查询获取课程及相关信息:

class Query(graphene.ObjectType):
    all_students = graphene.List(StudentType)
    all_teachers = graphene.List(TeacherType)
    all_courses = graphene.List(CourseType)

    def resolve_all_students(self, info, **kwargs):
        return Student.objects.all()

    def resolve_all_teachers(self, info, **kwargs):
        return Teacher.objects.all()

    def resolve_all_courses(self, info, **kwargs):
        return Course.objects.all()

schema = graphene.Schema(query=Query)

六. 连接 GraphQL 与 Django

school/views.py 中添加视图,用于测试 GraphQL 查询。在 school_management/urls.py 中将 URL 映射到该视图,以便通过浏览器访问 API。


七. 总结

本文介绍了 GraphQL 的基本原理及其在处理复杂数据结构中的优势。通过 Python 和 Django,我们构建了一个简易 GraphQL API,用于管理学校系统中的学生、教师和课程数据。GraphQL 高性能、低带宽使用,使其成为现代 API 开发的理想选择。建议读者通过实践进一步掌握 GraphQL,实现更多高效的数据交互场景。

原文链接: https://refine.dev/blog/graphql-with-python/