вернуть пользовательскую структуру данных из мутации графена (graphql) - PullRequest
0 голосов
/ 22 января 2020

У меня есть мутация, при которой я хотел бы вернуть данные произвольной формы, но мне трудно представить, как это сделать с помощью мутации графена .

Я бы хотел чтобы вернуть данные вроде этого:

{
    "foo": {
        "success": [
            {
                "id": "abc123",
                "goober": {
                    "success": [
                        {
                            "id": "goober-type-1",
                            "baz": "blahblahblah"
                        },
                        {
                            "id": "goober-type-2",
                            "baz": "blahblahblah"
                        }
                    ],
                    "failed": [],
                    "cancelled": []
                },
                "tronic": {
                    "success": [
                        {
                            "id": "tronic-type-1",
                            "baz": "blahblahblah"
                        },
                        {
                            "id": "tronic-type-2",
                            "baz": "blahblahblah"
                        }
                    ],
                    "failed": [],
                    "cancelled": []
                }
            }
        ],
        "failed": [
            {
                "id": "abc123",
                "goober": {
                    "success": [],
                    "failed": [
                        {
                            "id": "goober-type-3",
                            "baz": "blahblahblah"
                        }
                    ],
                    "cancelled": [
                        {
                            "id": "goober-type-4",
                            "baz": "blahblahblah"
                        }
                    ]
                },
                "tronic": {
                    "success": [],
                    "failed": [
                        {
                            "id": "tronic-type-4",
                            "baz": "blahblahblah"
                        }
                    ],
                    "cancelled": [
                        {
                            "id": "tronic-type-3",
                            "baz": "blahblahblah"
                        }
                    ]
                }
            }
        ]
    }
}

Мой инстинкт хотел определить graphene.ObjectType таким образом:

class Goober(graphene.ObjectType):
    id = graphene.String()
    baz = graphene.String()

class Tronic(graphene.ObjectType):
    id = graphene.String()
    baz = graphene.String()

class Foo(graphene.ObjectType):

    id = graphene.String()
    goober = graphene.ObjectType(
        success = graphene.List(Goober),
        failed = graphene.List(Goober),
        cancelled = graphene.List(Goober)
    )
    tronic = graphene.ObjectType(
        success = graphene.List(Tronic),
        failed = graphene.List(Tronic),
        cancelled = graphene.List(Tronic)
    )

class Results(graphene.ObjectType):
    foo = graphene.ObjectType(
        success=graphene.List(Foo),
        failed=graphene.List(Foo)
    )

Но я действительно никуда не денусь с этот подход, и я чувствую, что я в корне неправильно что-то понимаю.

Я имел успех в других областях, возвращая SQL объекты и некоторые пользовательские объекты, но не с генерацией и возвращением относительно сложных, вложенных данных, таких как это. Любой совет будет высоко ценится.

1 Ответ

1 голос
/ 28 января 2020

Правда в том, что документации по графену очень не хватает. Посмотрите на этот довольно длинный, но полный пример репликации ваших данных:

import json
import graphene

# let's just prepare some data
SUCCESS = [{
    "id": "abc123",
    "goober": {
        "success": [
            {
                "id": "goober-type-1",
                "baz": "blahblahblah"
            },
            {
                "id": "goober-type-2",
                "baz": "blahblahblah"
            }
        ],
        "failed": [],
        "cancelled": []
    },
    "tronic": {
        "success": [
            {
                "id": "tronic-type-1",
                "baz": "blahblahblah"
            },
            {
                "id": "tronic-type-2",
                "baz": "blahblahblah"
            }
        ],
        "failed": [],
        "cancelled": []
    }
}]

FAILED = [{
    "id": "abc123",
    "goober": {
        "success": [],
        "failed": [
            {
                "id": "goober-type-3",
                "baz": "blahblahblah"
            }
        ],
        "cancelled": [
            {
                "id": "goober-type-4",
                "baz": "blahblahblah"
            }
        ]
    },
    "tronic": {
        "success": [],
        "failed": [
            {
                "id": "tronic-type-4",
                "baz": "blahblahblah"
            }
        ],
        "cancelled": [
            {
                "id": "tronic-type-3",
                "baz": "blahblahblah"
            }
        ]
    }
}]

class Goober(graphene.ObjectType):
    id = graphene.String()
    baz = graphene.String()

class Tronic(graphene.ObjectType):
    id = graphene.String()
    baz = graphene.String()

class GooberResult(graphene.ObjectType):
    success = graphene.List(Goober)
    failed = graphene.List(Goober)
    cancelled = graphene.List(Goober)

class TronicResult(graphene.ObjectType):
    success = graphene.List(Tronic)
    failed = graphene.List(Tronic)
    cancelled = graphene.List(Tronic)

class FooResult(graphene.ObjectType):
    id = graphene.String()
    goober = graphene.Field(GooberResult)
    tronic = graphene.Field(TronicResult)

class Foo(graphene.Mutation):
    success = graphene.List(FooResult)
    failed = graphene.List(FooResult)

    def mutate(self, info):
        # provide some data as a mutation result
        success = SUCCESS
        failed = FAILED
        return Foo(success=success, failed=failed)

class Mutation(graphene.ObjectType):
    foo = Foo.Field()

schema = graphene.Schema(mutation=Mutation)
result = schema.execute("""
mutation Foo {
    foo {
        success {
            id
            goober {
                success {
                    id
                    baz
                }
            }
        }
        failed {
            id
            tronic {
                cancelled {
                    id
                    baz
                }
            }
        }
    }
}
""")

print(json.dumps(result.data, indent=2))

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

{
  "foo": {
    "success": [
      {
        "id": "abc123",
        "goober": {
          "success": [
            {
              "id": "goober-type-1",
              "baz": "blahblahblah"
            },
            {
              "id": "goober-type-2",
              "baz": "blahblahblah"
            }
          ]
        }
      }
    ],
    "failed": [
      {
        "id": "abc123",
        "tronic": {
          "cancelled": [
            {
              "id": "tronic-type-3",
              "baz": "blahblahblah"
            }
          ]
        }
      }
    ]
  }
}

С чего начать в документации, вероятно, находится отношение между ObjectType s и Field s . Скаляры действуют как Field s , однако ваши определенные ObjectType не делают, поэтому вам нужно обернуть их в graphene.Field. Тогда просто взгляните на Mutation s , чтобы использовать все это вместе.

...