Работа с большим количеством моделей с помощью графена в django
В моем проекте django есть много различных моделей, которые я хочу запросить с помощью GraphQL. Например:
class Country():
name = CharField(max_length=255)
class Competition():
id = IntegerField()
class Season():
start = DateTimeField(null=False, blank=False)
end = DateTimeField(null=False, blank=False)
class Team():
name = CharField(max_length)
... etc
В моем schema.py мне нужно создать GraphQL Types:
class CountryType():
class Meta:
model = models.Country
fields = '__all__'
class CompetitionType():
class Meta:
model = models.Competition
fields = '__all__'
class SeasonType():
class Meta:
model = models.Season
fields = '__all__'
class TeamType():
class Meta:
model = models.Team
fields = '__all__')
... etc
И последнее, но не менее важное: я должен создать класс Query в schema.py:
class Query(graphene.ObjectType):
country = graphene.relay.Node.Field(CountryType)
competition = graphene.relay.Node.Field(CompetitionType)
season = graphene.relay.Node.Field(SeasonType)
team = graphene.relay.Node.Field(TeamType)
all_country = graphene.List(CountryType)
all_competition = graphene.List(CompetitionType)
all_season = graphene.List(SeasonType)
all_team = graphene.List(TeamType)
def resolve_all_countries(root, info):
return models.Country.objects.all()
def resolve_all_competitions(root, info):
return models.Competition.objects.all()
def resolve_all_seasons(root, info):
return models.Season.objects.all()
def resolve_all_teams(root, info):
return models.Team.objects.all()
def resolve_country_by_name(root, info, name):
try:
return Country.objects.get(name = name)
except Country.DoesNotExist:
return None
... etc
Все это похоже на много шаблонного кода, который добавляет ненужную сложность и накладные расходы. Конечно, для сложных запросов вам придется писать свои собственные функции, но действительно ли это "путь к успеху" для общих запросов и *Type Classes?
Используя DjangoObjectType из graphene-django, вам не нужно определять все основные запросы, как эти части:
def resolve_all_countries(root, info):
return models.Country.objects.all()
def resolve_all_competitions(root, info):
return models.Competition.objects.all()
def resolve_all_seasons(root, info):
return models.Season.objects.all()
def resolve_all_teams(root, info):
return models.Team.objects.all()
все остальное все равно понадобится.
Ваш конкретный пример с использованием DjangoObjectType
import graphene
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
class CountryType(DjangoObjectType):
class Meta:
model = models.Country
interfaces = (relay.Node, )
filter_fields = ["name"]
class CompetitionType(DjangoObjectType):
class Meta:
model = models.Competition
interfaces = (relay.Node, )
class SeasonType(DjangoObjectType):
class Meta:
model = models.Season
interfaces = (relay.Node, )
class TeamType(DjangoObjectType):
class Meta:
model = models.Team
interfaces = (relay.Node, )
class Query(graphene.ObjectType):
country = graphene.relay.Node.Field(CountryType)
competition = graphene.relay.Node.Field(CompetitionType)
season = graphene.relay.Node.Field(SeasonType)
team = graphene.relay.Node.Field(TeamType)
all_country = DjangoFilterConnectionField(CountryType)
all_competition = DjangoFilterConnectionField(CompetitionType)
all_season = DjangoFilterConnectionField(SeasonType)
all_team = DjangoFilterConnectionField(TeamType)
Вы можете найти эту ссылку полезной для вашего конкретного случая использования:
https://docs.graphene-python.org/projects/django/en/latest/tutorial-relay/