GraphQL在Django中的使用教程
作者:Mr.Lee 发布时间:2023-02-20 18:11:31
标签:GraphQL,Django,使用
简介
特点
请求你所要的数据,不多不少
获取多个资源,只用一个请求
描述所有的可能,类型系统
几乎所有语言支持
文档
Graphene-Python
GraphQL | A query language for your API
背景
传统restful的接口定义类型多,试图简化接口定义
django中使用restframework定义restful资源接口时,可能会出现深度查询,造成有时候查询过度
例如前端用户需要查询接口用于展示在下拉框时,用户仅需要id与value值时,造成无用字段冗余,影响接口返回性能
当一张表字段较多时,例如接口1一共有40个字段,A页面需要5个字段做展示,B页面需要另外10个字段展示,这时我们需要根据用户需求定义返回接口提升性能,且数据不会被暴露
实际问题
问题
请求数据量40kB可以根据用户缩减,也就是返回数据量可以做到<40KB
后端数据实际耗时783ms,但是数据传输一共耗时5s
Django中如何使用呢
安装
安装
pip install graphene-django
django配置
INSTALLED_APPS = [
"django.contrib.staticfiles",
"graphene_django"
]
GRAPHENE = {
"SCHEMA": "test_api.schema.schema" # 下文中需要定义schema.py文件
}
Demo
定义数据库模型
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100, help_text="名称")
id = models.BigAutoField(primary_key=True)
class Ingredient(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=100, help_text="名称")
notes = models.TextField(help_text="笔记")
category = models.ForeignKey(
Category, related_name="category", on_delete=models.CASCADE
)
def __str__(self):
return self.name
定义serializer
from graphene_django.rest_framework.mutation import SerializerMutation
from rest_framework.serializers import ModelSerializer
from ..models import Category, Ingredient
class CategorySerializer(ModelSerializer):
class Meta:
model = Category
fields = "__all__"
class IngredientSerializer(ModelSerializer):
class Meta:
model = Ingredient
fields = "__all__"
定义接口
import graphene
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from graphene_django.rest_framework.mutation import SerializerMutation
from ..models import Category, Ingredient
from ..serializer import CategorySerializer, IngredientSerializer
# 为查询添加查询总数
class CountableConnectionBase(relay.Connection):
class Meta:
abstract = True
total_count = graphene.Int()
def resolve_total_count(self, info, **kwargs):
return self.iterable.count()
# Ingredient 查看过滤
class IngredientFilter(DjangoObjectType):
class Meta:
model = Ingredient
fields = "__all__"
filter_fields = {
"name": ['exact', "contains", "istartswith"],
"category": ["exact"],
'category__name': ['exact'],
}
interfaces = (relay.Node,)
connection_class = CountableConnectionBase
extra_field = graphene.String()
def resolve_extra_field(self: Ingredient, info):
return "hello!" + str(self.id)
# CategoryFilter 查询过滤
class CategoryFilter(DjangoObjectType):
class Meta:
model = Category
fields = "__all__"
filter_fields = {
"name": ['exact', "contains", "istartswith"],
}
interfaces = (relay.Node,)
connection_class = CountableConnectionBase
# CategoryMutation 修改或新增
class CategoryMutation(SerializerMutation):
class Meta:
serializer_class = CategorySerializer
# IngredientMutation 修改或新增
class IngredientMutation(SerializerMutation):
class Meta:
serializer_class = IngredientSerializer
# 汇总query接口
class ApiQuery(graphene.ObjectType):
search_category = DjangoFilterConnectionField(CategoryFilter)
search_ingredient = DjangoFilterConnectionField(IngredientFilter)
# 汇总操作类接口
class ApiMutation(graphene.ObjectType):
update_category = CategoryMutation.Field()
update_ingredient = IngredientMutation.Field()
汇总所有接口
import graphene
from .api import ApiQuery, ApiMutation
class Query(ApiQuery):
# 新增时提供多继承即可
pass
class Mutation(ApiMutation):
# 新增时提供多继承即可
pass
schema = graphene.Schema(query=Query, mutation=Mutation)
启动
python manage.py runserver 0.0.0.0:8080
接口文档
总结
查询时,可以使用django_filter , 快速查询
用法基本和drf框架基本类似
接口面涉及的深度查询,通过connection实现,如果返回字段中没有改要求,将不会深度查询
来源:https://blog.csdn.net/xzpdxz/article/details/128436581
0
投稿
猜你喜欢
- 编这个程序是想过节过年,一些重要的纪念日,给亲戚好友发祝福之类的,但要凌晨0点才显得比较有诚意,可我又比较贪睡,常常忘了,所以就有了编个微信
- 处理办法,删除该文件,或清空该文件内容;我的处理是清空后,再设置该文件权限为Everyone拒绝访问。
- 一、两层结构的ASP应用有何缺点 在Browser/Server 应用程序开发领域,微软公司的IIS/ASP以其强大的功能,良好的扩展能力,
- 这本入门手册是否合适你?我只想告诉你我非常喜欢这本书。我对Microsoft Access的经验足以让我跳过这本傻瓜系列教材,但是实际情况是
- 这个程序的功能非常的简单,就是每天在系统中新建一个文件夹。文件夹即当前的时间。此代码是在同事那边看到的,为了锻炼下自己薄弱的Python能力
- 在windows+iis服务器上运行asp程序可能会出现数据库无法更新的情况,具体错误信息可能为: 1、Microsoft JET Data
- tensorflow里面给出了一个函数用来读取图像,不过得到的结果是最原始的图像,是咩有经过解码的图像,这个函数为tf.gfile.Fast
- from keras.utils.np_utils import to_categorical注意:当使用categorical_cross
- MongoDB安装模块pip install pymongo连接数据库import pymongoclient = pymongo.Mong
- 经常看到有新手问PHP有没有类似asp的left函数或right函数,实现截取某字符串左边或右边开始N个字符的函数。答案当然是有的。PHP中
- QUICKSORT(A, p, r)是快速排序的子程序,调用划分程序对数组进行划分,然后递归地调用QUICKSORT(A, p, r),以完
- 本文实例讲述了PHP中round()函数对浮点数进行四舍五入的方法。分享给大家供大家参考。具体方法如下:语法:round(x,prec)参数
- Python 模块安装一. 打开命令提示符win + R 输入 cmd 点击确定或者win + S 搜索输入 cmd二. 环境变量没有问题的
- 异常是指因为程序出现了错误而在正常控制流以外采取的行动,其分为两个阶段,第一阶段是引发异常的错误,当系统检测到错误并且意识到异常条件,解释器
- 语言:Python IDE:Python.IDE需求 做出彩虹效果颜色空间 RGB模型:光的三原色,共同决定色相 HSB/HSV模型:H色彩
- MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型下面
- 一、简介主流被使用的地理坐标系并不统一,常用的有WGS84、GCJ02(火星坐标系)、BD09(百度坐标系)以及百度地图中保存矢量信息的we
- 摘要在Nginx和uWSGI还没配置时,单独在url.py使用apscheduler设置定时任务,使用python manage.py ru
- 如下所示:#Copyright (c)2017, 东北大学软件学院学生# All rightsreserved#文件名称:a.py# 作 &
- Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它