#其他Django應用...
'graphene_django',
]

然后,創建一個新的GraphQL視圖(例如,urls.py中定義)。

fromdjango.urlsimportpath
fromgraphene_django.viewsimportGraphQLView

urlpatterns=[
path('graphql/',GraphQLView.as_view(graphiql=True)),#graphiql讓你在瀏覽器中直接操作
]

這樣一來,我們就擁有了一個基本的GraphQLAPI端點,/graphql/,并且可以直接在瀏覽器中通過GraphiQL操作它。

定義GraphQLSchema

在Graphene中,我們的API是由一個個Schema組成的。一個Schema就像是一個藍圖,定義了客戶端可以查詢和修改的數據類型。Schema中包含了查詢(Query)、變更(Mutation)和訂閱(Subscription)等類型。這里我們先關注QueryMutation

定義類型(Type)

我們通常需要先定義數據類型,再在Schema中使用它們。比如說,假設我們有一個Book模型,我們可以先定義一個BookType,它對應了我們數據庫中的Book模型。

importgraphene
fromgraphene_django.typesimportDjangoObjectType
from.modelsimportBook

#定義Book類型
classBookType(DjangoObjectType):
classMeta:
model=Book
fields=('id','title','author','published_date')

在這個例子中,我們使用DjangoObjectType讓Graphene知道Book是一個Django模型,并且列出我們希望通過GraphQL查詢的字段。

定義查詢(Query)

接下來,我們需要定義一個查詢接口,讓用戶可以通過GraphQL查詢數據。比如,用戶可以查詢所有書籍,或者按照ID查詢書籍:

classQuery(graphene.ObjectType):
all_books=graphene.List(BookType)
book_by_id=graphene.Field(BookType,id=graphene.Int())

defresolve_all_books(self,info):
returnBook.objects.all()

defresolve_book_by_id(self,info,id):
returnBook.objects.get(id=id)

這里,resolve_all_booksresolve_book_by_id分別定義了如何獲取所有書籍和根據ID獲取書籍的數據。需要注意的是,resolve_*方法的命名規則和字段名要一致。

定義變更(Mutation)

除了查詢,GraphQL還支持數據的變更操作(例如,創建、更新和刪除)。我們通過定義Mutation來實現這一功能。比如,添加一本書:

classCreateBook(graphene.Mutation):
classArguments:
title=graphene.String()
author=graphene.String()
published_date=graphene.String()

book=graphene.Field(BookType)

defmutate(self,info,title,author,published_date):
book=Book.objects.create(title=title,author=author,published_date=published_date)
returnCreateBook(book=book)

classMutation(graphene.ObjectType):
create_book=CreateBook.Field()

這個例子中,CreateBook是一個變更操作,它接收書籍的信息并創建一個新的Book實體。Mutation類則將所有變更操作集中管理。

使用GraphQL查詢和變更

在GraphiQL中,我們可以通過GraphQL查詢和變更數據。

查詢所有書籍

query{
allBooks{
id
title
author
}
}

根據ID查詢書籍

query{
bookById(id:1){
title
author
}
}

創建一本新書

mutation{
createBook(title:"Python深入淺出",author:"張三",publishedDate:"2024-12-07"){
book{
id
title
author
}
}
}

通過這些查詢和變更,我們可以輕松操作數據庫中的數據。

讓API更加類型安全

GraphQL的強大之處不僅在于它的靈活性,還在于它的類型系統。通過嚴格的類型定義,我們可以確保前端請求的數據格式始終符合預期。Graphene提供了強類型支持,確保所有字段都擁有清晰的類型說明,并且在請求時能夠進行類型驗證。

例如,之前我們定義的BookType明確指定了每個字段的類型,包括idInt類型,titleauthorString類型。這意味著當客戶端請求這些字段時,GraphQL會自動檢查返回數據的類型是否正確,從而防止不符合預期的錯誤發生。

溫馨提示

有時候,我們在設計Schema時,可能會忘記為某些字段定義類型,或者誤將字段類型設置得不夠準確。這時候,Graphene會拋出類型錯誤。為避免這種情況,建議在定義字段時使用Graphene提供的標準類型(如StringIntFloat等),并始終檢查字段類型是否匹配。

結語

通過Graphene和Django深度集成,構建一個高性能、類型安全的GraphQLAPI已經變得非常簡單。我們只需要關注定義數據類型、查詢和變更操作,然后通過GraphQL自動化處理請求和響應。這種方式不僅提高了開發效率,還確保了系統的類型安全,讓前后端協作更加流暢。

文章轉自微信公眾號@鄉村鵬飛

上一篇:

使用 Django REST Framework構建Web API操作步驟

下一篇:

Kubernetes Gateway API 攻略:解鎖集群流量服務新維度
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費