Pytigon integruje GraphQL przez system ObjectType Django, dając klientom możliwość zażądania dokładnie tych danych, których potrzebują. Ani za dużo, ani za mało. Bez pobierania nadmiarowego, bez niedoboru.
GraphQL uzupełnia widoki przypominające REST w Pytigonie. Używaj REST dla standardowych operacji CRUD, a GraphQL, gdy:
Typy GraphQL mapują się na Twoje modele Django:
import graphene
from graphene_django import DjangoObjectType
from .models import Album, Track
class AlbumType(DjangoObjectType):
class Meta:
model = Album
fields = ("id", "name", "artist", "release_date", "tracks")
class TrackType(DjangoObjectType):
class Meta:
model = Track
fields = ("id", "title", "duration", "album")
Zdefiniuj zapytania udostępniające Twoje dane:
class Query(graphene.ObjectType):
all_albums = graphene.List(AlbumType)
album = graphene.Field(AlbumType, id=graphene.Int())
def resolve_all_albums(self, info, **kwargs):
return Album.objects.all()
def resolve_album(self, info, id):
return Album.objects.get(pk=id)
Zdefiniuj mutacje do tworzenia i aktualizacji danych:
class CreateAlbum(graphene.Mutation):
class Arguments:
name = graphene.String(required=True)
artist = graphene.String(required=True)
album = graphene.Field(AlbumType)
def mutate(self, info, name, artist):
album = Album(name=name, artist=artist)
album.save()
return CreateAlbum(album=album)
Integracja GraphQL Pytigona respektuje ten sam system uwierzytelniania i uprawnień co reszta aplikacji:
from pytigon_lib.schdjangoext.graphql import login_required
class Query(graphene.ObjectType):
all_albums = graphene.List(AlbumType)
@login_required
def resolve_all_albums(self, info, **kwargs):
return Album.objects.all()
Punkt końcowy GraphQL jest dostępny pod /graphql/. Użyj dowolnego klienta GraphQL, by go odpytać:
query {
allAlbums {
name
artist
tracks {
title
duration
}
}
}
Pytigon dostarcza obsługę OAuth dla punktów końcowych GraphQL, umożliwiając aplikacjom zewnętrznym uwierzytelnianie i dostęp do danych przez GraphQL z autoryzacją opartą na tokenach.