【Python】Django使用GraphQL詳解

什么時(shí)API

API的本質(zhì)就是幫人讀數(shù)據(jù)寸宵、寫數(shù)據(jù)崖面。流派在變,技術(shù)在變梯影,寫API巫员、用API的人的職稱也會(huì)變,但是API的本質(zhì)不會(huì)變甲棍。無論是哪種API简识,它的終極目的就是能讓人讀數(shù)據(jù)讀的輕松,寫數(shù)據(jù)寫的愉快。懂了這個(gè)七扰,就明白了GraphQL解決的是什么問題奢赂。

為什么不用REST

  • Rest一次只能請(qǐng)求一個(gè)資源,會(huì)造成太多的http請(qǐng)求
  • Rest的版本控制問題是一個(gè)痛

GraphQL的關(guān)鍵語句

  • query:查詢颈走,相當(dāng)于GET
  • mutation:變化膳灶,相當(dāng)于POST, PUT, DELETE

環(huán)境搭建

  • win10
  • Python3.6
  • pip install django==2.0.1
  • pip install graphene-django==2.0.0

創(chuàng)建項(xiàng)目

  • django-admin.py startproject django_graphql
  • cd django_graphql
  • python startapp book
  • 項(xiàng)目的文件組織
image.png

創(chuàng)建model

  • book/models.py
from django.db import models

# Create your models here.
class Title(models.Model):
    title = models.CharField(max_length=255, verbose_name="標(biāo)題")

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=255, verbose_name="作者姓名")

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.ForeignKey(Title, related_name='book_title', on_delete=models.CASCADE)
    author = models.ForeignKey(Author, related_name='book_author', on_delete=models.CASCADE)

創(chuàng)建schema.py

  • book/schema.py
import graphene
from graphene_django.types import DjangoObjectType

from .models import Book, Title, Author


class BookType(DjangoObjectType):
    class Meta:
        model = Book


class TitleType(DjangoObjectType):
    class Meta:
        model = Title


class AuthorType(DjangoObjectType):
    class Meta:
        model = Author


# 定義動(dòng)作,類似POST, PUT, DELETE
class BookInput(graphene.InputObjectType):
    title = graphene.String(required=True)
    author = graphene.String(required=True)

class CreateBook(graphene.Mutation):
    # api的輸入?yún)?shù)
    class Arguments:
        book_data = BookInput(required=True)

    # api的響應(yīng)參數(shù)
    ok = graphene.Boolean()
    book = graphene.Field(BookType)

    # api的相應(yīng)操作立由,這里是create
    def mutate(self, info, book_data):
        title = Title.objects.create(title=book_data['title'])
        author = Author.objects.create(name=book_data['author'])
        book = Book.objects.create(title=title, author=author)
        ok = True
        return CreateBook(book=book, ok=ok)


# 定義查詢轧钓,類似GET
class Query(object):
    all_books = graphene.List(BookType)
    all_titles = graphene.List(TitleType)
    all_authors = graphene.List(AuthorType)

    def resolve_all_books(self, info, **kwargs):
        # 查詢所有book的邏輯
        return Book.objects.all()

    def resolve_all_titles(self, info, **kwargs):
        # 查詢所有title的邏輯
        return Book.objects.select_related('book_title').all()

    def resolve_all_authors(self, info, **kwargs):
        # 查詢所有author的邏輯
        return Book.objects.select_related('book_author').all()

創(chuàng)建總的schema入口文件

  • 再settings.py的同級(jí)目錄下創(chuàng)建:schema.py

import graphene
import book.schema

class Query(book.schema.Query, graphene.ObjectType):
    # 總的Schema的query入口
    pass

class Mutations(graphene.ObjectType):
    # 總的Schema的mutations入口
    create_book = book.schema.CreateBook.Field()

schema = graphene.Schema(query=Query, mutation=Mutations)

配置總的url

from django.contrib import admin
from django.urls import path

from graphene_django.views import GraphQLView
from .schema import schema

urlpatterns = [
    path('admin/', admin.site.urls),
    path('graphql/', GraphQLView.as_view(graphiql=True, schema=schema)),
]

啟動(dòng)項(xiàng)目

  • python manage.py makemigrations
  • python manage.py migrate
  • python manage.py runserver 0.0.0.0:8080
  • 訪問:localhost:8080/graphql/


    image.png

創(chuàng)建book

mutation createBook {
  createBook(bookData: {title:"django-graphgl2", author: "ns2250225"}) {
    book {
      title {
        id,
        title
      },
      author {
        id,
        name
      }
    }
    ok
  }
}
image.png

查詢book

image.png

Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锐膜,隨后出現(xiàn)的幾起案子毕箍,更是在濱河造成了極大的恐慌,老刑警劉巖道盏,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件而柑,死亡現(xiàn)場離奇詭異,居然都是意外死亡荷逞,警方通過查閱死者的電腦和手機(jī)媒咳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颅围,“玉大人伟葫,你說我怎么就攤上這事恨搓⊥勾唬” “怎么了晦譬?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我主卫,道長,這世上最難降的妖魔是什么饭寺? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任傅事,我火速辦了婚禮,結(jié)果婚禮上宪郊,老公的妹妹穿的比我還像新娘掂恕。我一直安慰自己,他們只是感情好弛槐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布懊亡。 她就那樣靜靜地躺著,像睡著了一般乎串。 火紅的嫁衣襯著肌膚如雪店枣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音鸯两,去河邊找鬼闷旧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钧唐,可吹牛的內(nèi)容都是我干的忙灼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼钝侠,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼缀棍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起机错,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤爬范,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后弱匪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體青瀑,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年萧诫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斥难。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帘饶,死狀恐怖哑诊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情及刻,我是刑警寧澤镀裤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站缴饭,受9級(jí)特大地震影響暑劝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颗搂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一担猛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丢氢,春花似錦傅联、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稍浆,卻和暖如春载碌,著一層夾襖步出監(jiān)牢的瞬間猜嘱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工嫁艇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朗伶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓步咪,卻偏偏與公主長得像论皆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猾漫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348