Graphene.Field() с filter() и graphene.List() с get() возвращают ошибки (Graphene Django)

<Case 1>

Я использовал "graphene.Field()" с "get()" и "graphene.List()" с "filter()" для получения одного конкретного объекта.

"graphene.Field()" с "get()" в schema.py:

import graphene
from graphene_django import DjangoObjectType
from .models import Category

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category
        fields = ("id","name")

    all_categories = graphene.Field(CategoryType, id=graphene.Int()) # graphene.Field()

    def resolve_all_categories(root, info, id):
        return Category.objects.get(pk=id) # get()
    
schema = graphene.Schema(query=Query)

"graphene.List()" с "filter()" в schema.py:

import graphene
from graphene_django import DjangoObjectType
from .models import Category

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category
        fields = ("id","name")

    all_categories = graphene.List(CategoryType, id=graphene.Int()) # graphene.List()

    def resolve_all_categories(root, info, id):
        return Category.objects.filter(pk=id) # filter()
    
schema = graphene.Schema(query=Query)

Затем, я запросил "allCategories" для обоих кодов в schema.py выше по очереди:

query {
  allCategories(id:1) {
    id
    name
  }
}

Наконец, я получил этот результат без ошибок для "graphene.Field()" с "get()" в schema.py:

{
  "data": {
    "allCategories": {
      "id": "1",
      "name": "category1"
    }
  }
}

И этот результат без ошибок для "graphene.List()" с "filter()" в schema.py:

{
  "data": {
    "allCategories": [
      {
        "id": "1",
        "name": "category1"
      }
    ]
  }
}

<Case 2>

Далее я использовал "graphene.Field()" с "filter()" и "graphene.List()" с "get()" для получения одного конкретного объекта.

"graphene.Field()" с "filter()" в schema.py:

import graphene
from graphene_django import DjangoObjectType
from .models import Category

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category
        fields = ("id","name")

    all_categories = graphene.Field(CategoryType, id=graphene.Int()) # graphene.Field()

    def resolve_all_categories(root, info, id):
        return Category.objects.filter(pk=id) # filter()
    
schema = graphene.Schema(query=Query)

"graphene.List()" с "get()" в schema.py:

import graphene
from graphene_django import DjangoObjectType
from .models import Category

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category
        fields = ("id","name")

    all_categories = graphene.List(CategoryType, id=graphene.Int()) # graphene.List()

    def resolve_all_categories(root, info, id):
        return Category.objects.get(pk=id) # get()
    
schema = graphene.Schema(query=Query)

Затем, я запросил "allCategories" для обоих кодов в schema.py выше по очереди:

query {
  allCategories(id:1) {
    id
    name
  }
}

Но наконец, я получил эту ошибку для "graphene.Field()" с "filter()" в schema.py:

{
  "errors": [
    {
      "message": "Received incompatible instance \"<QuerySet [<Category: category1>]>\"."
    }
  ],
  "data": {
    "allCategories": null
  }
}

И эта ошибка для "graphene.List()" с "get()" в schema.py:

{
  "errors": [
    {
      "message": "User Error: expected iterable, but did not find one for field Query.allCategories."
    }
  ],
  "data": {
    "allCategories": null
  }
}

Почему я получил эти две ошибки выше для "<Case 2>" отличающиеся от "<Case 1>"?

"graphene.Field()" не соответствует "filter()" и "graphene.List()" не соответствует "get()".

"graphene.Field()" "filter()"

"graphene.List()" "get()"

"graphene.Field()" совпадает с "get()" и "graphene.List()" совпадает с "filter()".

"graphene.Field()" "get()"

"graphene.List()" "filter()"

"graphene.Field()" предназначен для одного объекта с фигурными скобками "{}" самой внешней части и "get()" может вернуть один объект с фигурными скобками "{}" самой внешней части, поэтому "graphene. Field()" совпадает с "get()".

Пример:

{
  "name": "John",
  "age": "32",
  "gender": "Male"
}

Вы можете увидеть свой результат для "graphene.Field()" с "get()" в schema. py, "<Case 1>" имеет один объект с фигурными скобками "{}" для "allCategories" внутри "data":

{
  "data": {
    "allCategories": { // Curly Braces "{}"
      "id": "1",
      "name": "category1"
    }
  }
}

"graphene. List()" предназначен для списка(множества) из одного или нескольких объектов с квадратными скобками "[]" самой внешней и "filter()" может вернуть список(множество) из одного или нескольких объектов с квадратными скобками "[]" самой внешней так что "graphene. List()" совпадает с "filter()":

Пример:

[
  {
    "name": "John",
    "age": "32",
    "gender": "Male"
  },
  {
    "name": "Tom",
    "age": "17",
    "gender": "Male"
  },
  {
    "name": "Marry",
    "age": "24",
    "gender": "Female"
  }
]

Вы можете увидеть свой результат для "graphene.List()" с "filter()" в schema. py, "<Case 1>" имеет список (набор) из одного объекта с квадратными скобками "[]" для "allCategories" внутри "data":

{
  "data": {
    "allCategories": [ // Square Brackets "[]"
      {
        "id": "1",
        "name": "category1"
      }
    ]
  }
}

Некоторые функции, которые можно использовать с "graphene.Field()":

get()
first()
last()
... 

There will be some more functions to be able to use with "graphene.Field()"

Некоторые функции, которые можно использовать с "graphene.List()":

filter()
aggregate()
all()
annotate()
extra()
check()
iterator()
... 

There will be some more functions to be able to use with "graphene.List()"
Вернуться на верх