
使用NestJS和Prisma構建REST API:身份驗證
#其他Django應用...
'graphene_django',
]
然后,創建一個新的GraphQL視圖(例如,urls.py
中定義)。
fromdjango.urlsimportpath
fromgraphene_django.viewsimportGraphQLView
urlpatterns=[
path('graphql/',GraphQLView.as_view(graphiql=True)),#graphiql讓你在瀏覽器中直接操作
]
這樣一來,我們就擁有了一個基本的GraphQLAPI端點,/graphql/
,并且可以直接在瀏覽器中通過GraphiQL操作它。
在Graphene中,我們的API是由一個個Schema組成的。一個Schema就像是一個藍圖,定義了客戶端可以查詢和修改的數據類型。Schema中包含了查詢(Query)、變更(Mutation)和訂閱(Subscription)等類型。這里我們先關注Query和Mutation。
我們通常需要先定義數據類型,再在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查詢的字段。
接下來,我們需要定義一個查詢接口,讓用戶可以通過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_books
和resolve_book_by_id
分別定義了如何獲取所有書籍和根據ID獲取書籍的數據。需要注意的是,resolve_*
方法的命名規則和字段名要一致。
除了查詢,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
類則將所有變更操作集中管理。
在GraphiQL中,我們可以通過GraphQL查詢和變更數據。
query{
allBooks{
id
title
author
}
}
query{
bookById(id:1){
title
author
}
}
mutation{
createBook(title:"Python深入淺出",author:"張三",publishedDate:"2024-12-07"){
book{
id
title
author
}
}
}
通過這些查詢和變更,我們可以輕松操作數據庫中的數據。
GraphQL的強大之處不僅在于它的靈活性,還在于它的類型系統。通過嚴格的類型定義,我們可以確保前端請求的數據格式始終符合預期。Graphene提供了強類型支持,確保所有字段都擁有清晰的類型說明,并且在請求時能夠進行類型驗證。
例如,之前我們定義的BookType
明確指定了每個字段的類型,包括id
是Int
類型,title
和author
是String
類型。這意味著當客戶端請求這些字段時,GraphQL會自動檢查返回數據的類型是否正確,從而防止不符合預期的錯誤發生。
有時候,我們在設計Schema時,可能會忘記為某些字段定義類型,或者誤將字段類型設置得不夠準確。這時候,Graphene會拋出類型錯誤。為避免這種情況,建議在定義字段時使用Graphene提供的標準類型(如String
、Int
、Float
等),并始終檢查字段類型是否匹配。
通過Graphene和Django深度集成,構建一個高性能、類型安全的GraphQLAPI已經變得非常簡單。我們只需要關注定義數據類型、查詢和變更操作,然后通過GraphQL自動化處理請求和響應。這種方式不僅提高了開發效率,還確保了系統的類型安全,讓前后端協作更加流暢。
文章轉自微信公眾號@鄉村鵬飛