Как я могу определить пользовательские типы вывода для мутаций с графеном django? - PullRequest
1 голос
/ 04 февраля 2020

Мутации Create / Remove / Update / Delete (CRUD) обычно возвращают соответствующий экземпляр модели базы данных в качестве выходного типа мутации. Однако для мутаций без CRUD я бы хотел определить бизнес-логики c конкретизированные c типы вывода мутаций. Например, возвращает количество элементов списка + список идентификаторов, которые не могут быть отображены 1-к-1 между типом graphql и моделями БД. Как я могу добиться этого с graphene-django?

1 Ответ

0 голосов
/ 04 февраля 2020

Список, не связанный с моделями

Поскольку вы хотите вернуть счетчик и список элементов, вы можете создать пользовательский тип:

class ListWithCountType(graphene.Scalar):

    @staticmethod
    def serialize(some_argument):
        # make computation here
        count = ...
        some_list = ...
        return { "count": count, "list": some_list }

Затем вы используете для своей мутации это так:

class MyMutation(graphene.Mutation):
    list_with_count = graphene.Field(ListWithCountType)

    @classmethod
    def mutate(cls, root, info, **kwargs):
        some_argument = kwargs.pop("some_argument")
        return cls(list_with_count=some_argument)

Добавить в свою схему:

class Query(graphene.ObjectType):
    my_mutation = MyMutation.Field()

Должно возвращать что-то вроде:

{
  "data": {
    "list_with_count": {
      "count": <COUNT VALUE>,
      "list": <SOME_LIST VALUE>
    }
  }
}

* PS: если это только выход , Хорошо. Но если вы хотите, чтобы этот тип был аргументом, вы должны также реализовать «parse_literal» и «parse_value», кроме «serialize».

Здесь - это пример с используемым пользовательским ErrorType с формами.

Список, относящийся к моделям

Из документов :

# cookbook/ingredients/schema.py

import graphene

from graphene_django.types import DjangoObjectType

from cookbook.ingredients.models import Category


class CategoryType(DjangoObjectType):
    class Meta:
        model = Category

class Query(object):
    all_categories = graphene.List(CategoryType)

    def resolve_all_categories(self, info, **kwargs):
        return Category.objects.all()

На вашей схеме:

import graphene

import cookbook.ingredients.schema


class Query(cookbook.ingredients.schema.Query, graphene.ObjectType):
    pass

schema = graphene.Schema(query=Query)

Затем вы можете запросить:

query {
  allCategories {
    id
  }
}

Должно вернуть что-то вроде:

{
  "data": {
    "allCategories": [
      {
        "id": "1",
      },
      {
        "id": "2",
      },
      {
        "id": "3",
      },
      {
        "id": "4",
      }
    ]
  }
}

Вот пример с моделью пользователя .

...