Работа с большим количеством моделей с помощью графена в 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/

Вернуться на верх